`

数据库中避免树形结构出现回环图

    博客分类:
  • SQL
阅读更多
Q:以最简单的表结构设计出符合需求的组织架构?
A:组织架构通常是树形结构,上级包含下级所有权限。因此表结构可以如下设计:
            +----+------+--------+
            | ID | NAME | parent |
            +----+------+--------+
            其中parent为外键列,引用指向当前表ID,同时约束CHECK(ID <> parent) 来确保数据的有效性。

Q:是否可以仅通过一条SQL获取指定ID的所有子集列表?
A:不能。一条SQL只能在数据库执行一次,SQL仅具备常规逻辑(与[and], 或[or, in, not in], 非[is null, is not null])能力不具备如循环、递归等能力,所以不能直接通过一条SQL语句获取到所有需要的数据;因此要获取子集列表只能通过程序控制;

Q:如何获取子集列表?
A:可以有两种选择:
  1、使用数据库支持的存储过程(Procedure);
  2、使用编程语言(如:Java,C#,PHP等,该文以Java为例)循环实现;
  对比:
   +----+--------+----------------+
   |    |    Procedure    | PL(Programming Languages) |
   +----+--------+----------------+
   |    优点   | 减少SQL传输 | 语言性能更强,更容易控制   |
   +----+--------+----------------+
   |    缺点   | 增加DB响应时间 |   层次深、节点多时,SQL发 |
   |    |        |    送次数不确定      |
   +----+--------+----------------+
   递归层次3层以下且分支在2条左右可以使用PL实现,在此作者推荐Procedure方式实现;

Q:如何避免在树架构中出现图架构(回环)?
A: 关于这个问题,作者和同事在初时也是头疼不已;如何规避树结构夹杂图结构主要由以下两方面入手:
   第一、数据插入前,递归(循环) 验证目标节点(TN--Target Node)未出现在准父级( FTB--Father-To-Be)的父节点列表中;从 TN->FTB 是不好查询的,而反过来则要容易得多:FBT->TN;
   第二、为防止DB(数据库) 被通过非法途径污染架构树,在获取子集时也需要做验证(FBT->TN);
    *第三、设置插入触发器(IT--Insert Trigger),更新触发器(UT--Update Trigger),在触发器中验证 FBT->TN合法性;
    第四、经研究讨论后,发现一种更有效的方式避免在树结构中出现图结构:
        为树结构中的每个节点定义层级概念!
            +----+------+--------+-------+
            | ID | NAME | parent | Level |
            +----+------+--------+-------+
    | 1  | name1|  null  |  null |
            +----+------+--------+-------+
    | 2  | name2|   1    |   2   |
            +----+------+--------+-------+ 
    | 3  | name3|   1    |   2   |
            +----+------+--------+-------+ 
    | 4  | name4|  null  |  null |
            +----+------+--------+-------+ 
    | 5  | name5|   3    |   3   |
            +----+------+--------+-------+ 
     需求:1、将ID(3)父节点修改为ID(2).          a:获取ID(2)层级值(L2)
          b:获取ID(3)层级值(L3)
          c:验证ID(3)与ID(2)层级关系,被移动节点不能高于目标节点(L3>L2)
          d:获取L3需被提升的层次:DV=L3-L2-1 (DV--Difference  Value)

          e:修改以ID(3)为根的所有子节点(包括ID(3))层次都提升
        2、将ID(4)父节点分配为ID(3).
          a:获取ID(3) 层级值(L3)
          b:将L4修改为L3+1后完成操作
        3、将ID(5)父节点修改为ID(4).
          a:获取ID(4)层级值L4
          b:获取ID(5)层级值L5
          c:ID(5)不是根节点(L5<>1),设置L4=L5-1
          d:ID(5)是根节点,设置L4=1同时修改以ID(5)为根的所有子节点(包括ID(5))层次都降低1
分享到:
评论

相关推荐

    20200418_回环检测1

    在实际应用中,通常会将当前图像与已存储在数据库中的图像进行比较,以寻找潜在的回环。通过设置阈值,例如当前帧与之前关键帧的相似度超过一定比例,可以判断是否存在回环。 回环检测后的验证通常包括时间一致性...

    SPI_LoopBack_spi回环测试_28035_

    7. **优化建议**:在进行SPI回环测试时,应确保所有SPI信号的电平转换正确,避免信号反射和噪声干扰。同时,为了防止潜在的电源噪声影响,最好在纯净的电源环境下进行测试。 总的来说,SPI回环测试是验证SPI接口...

    CAN(回环LoopBack

    - 对于外部回环,连接器必须正确安装,以避免损坏设备。 - 分析测试结果时,要关注错误帧和位错误率,这些都是评估CAN系统性能的关键指标。 总的来说,CAN回环测试是保证CAN通信系统稳定运行的重要环节,通过神舟王...

    滞回环面积.rar_滞回_滞回曲线每圈面积;滞回环;能量_滞回曲线面积_滞回环_耗能面积

    滞回环的面积代表了在一次完整循环中的能量损失,这在设计抗震结构和材料疲劳寿命评估中至关重要。 首先,我们需要理解滞回环的每圈面积。这个面积可以被视为在循环加载过程中,系统通过摩擦、内耗或其他机制消耗的...

    副麦回环测试代码

    8. **异常处理**:在整个过程中,应处理可能出现的异常,如权限未授予、录音设备不可用等。 从压缩包中的文件名`SubMICPhoneTest`来看,这可能是测试程序的主类或测试用例,包含了上述步骤的实现。在实际项目中,...

    本地连接回环网建立

    2. **故障排除**:当网络出现问题时,可以通过回环网来判断是应用程序的问题还是网络基础设施的问题。 3. **软件开发**:在软件开发过程中,开发者可以利用回环网来进行独立的单元测试或集成测试。 4. **安全性测试*...

    关于面试题目中回环字符串的解答

    回环字符串,也称为环状字符串或循环字符串,是指可以通过将字符串的一部分移动到字符串的开头,使得整个字符串形成一个环状结构的字符串。在给定的代码中,我们有两个主要的函数`isok()`和两个辅助函数`addhead()`...

    windows回环设备创建.docx

    在Windows操作系统中,创建回环设备(Loopback Device)是一种常见的技术操作,它主要用于测试网络应用程序或服务,而无需实际的网络连接。回环设备在系统中表现为一个虚拟的网络接口,可以模拟网络数据包的发送和...

    stm32 can 回环测试验证代码

    STM32 CAN(控制器局域网)是一种广泛应用的通信协议,尤其在嵌入式系统中,用于设备间的高效、可靠的数据传输。...在开发阶段进行这样的测试,能有效避免在实际应用中出现的潜在问题,提高产品的质量和可靠性。

    STM32的CAN总线回环测试

    在回环测试中,开发板会发送特定的数据帧(例如0xAB和0xCD),并通过CAN总线接收这些数据帧。由于是回环测试,不需要外接导线,仅用一块开发板即可完成测试。 为了实现回环测试,必须设置好STM32的GPIO引脚,使得...

    STM32 can回环程序

    总结来说,STM32的CAN回环程序是一个用于测试和验证CAN通信功能的工具,通过内部回环,简化了对CAN接口功能的验证,避免了外部硬件的复杂设置。在理解和实现这样一个程序时,需要对STM32的HAL库以及CAN协议有一定的...

    回环网络配置

    回环网络是一种特殊的虚拟网络连接方式,主要用于测试网络软件或进行网络调试时,让数据包在本机内部循环而不发送到物理网络中。这种方式可以有效地帮助开发人员和系统管理员在没有实际网络连接的情况下进行测试与...

    winCE下使用一组buffer实现音频回环

    在Windows CE环境下,实现音频回环涉及到音频输入与输出设备的交互、缓冲区管理以及多线程编程。本文将深入探讨这些关键知识点。 首先,音频回环(Loopback)是一种技术,它允许音频数据从输入设备捕获后,直接...

    基于深度学习的回环检测算法研究.pdf

    摘要:本文主要探讨了移动机器人在进行定位和建图过程中出现的位姿漂移问题。在机器人利用视觉传感器进行移动时,通过分析相邻两帧图片来计算位姿变化,这种计算方式导致随着时间的推移和图片帧数的增加,机器人的...

    LT-ARM214X学习板声卡回环测试

    在IT领域,尤其是在嵌入式系统的学习和开发中,声卡回环测试是一个常见的实践环节。这个测试主要用于验证声卡的音频输入和输出功能是否正常,确保声音信号能够正确地从输入端传输到输出端,形成一个闭合的回路。在本...

    hosxy#Settings#为UWP应用开启本地回环访问权限1

    1、什么是本地回环 2、开启本地回环访问权限 3、删除本地回环访问权限 4、查看可以拥有访问本地回环代理的应用列表 5、获取 UWP 应用的 SID 或者 Pa

    电子-CAN回环实验.rar

    4. 检查接收:在回环模式下,发送的数据应立即在接收邮箱中出现,验证数据的完整性和一致性。 5. 关闭回环模式:测试完成后,应恢复到正常操作模式,以便在实际CAN网络中使用。 此外,实验可能还会涉及到使用开发...

    wireshark抓取本地回环数据包和取出数据的方法

    4. 在编程中建立连接时,应使用本机的IP地址(如上述例子中的***.***.*.***),而不是使用本地回环地址(***.*.*.*)。例如,在一个socket连接中,使用`socket.Connect("***.***.*.***",4530);`来替代`socket....

    回环阵列蛇形阵列

    根据给定文件的信息,我们可以分析出这是一个C++程序,它主要实现了三种不同的矩阵填充方法:回环矩阵(check_matrix_round)、蛇形矩阵(check_matrix_snake)以及逆序矩阵(check_matrix_reverse)。接下来,我们...

    串口通信网络回环测试.rar

    这样,如果数据在传输过程中出现错误或丢失,可以通过比较发送和接收的数据来检测问题所在。在STM32中进行串口回环测试,通常包括以下步骤: 1. 初始化串口:首先,需要配置STM32的串口参数,包括波特率、数据位、...

Global site tag (gtag.js) - Google Analytics