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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 回环检测可以帮助检测滑窗的重复部分,从而使优化算法更加高效。此外,滑窗优化可以帮助提高回环检测的准确性,因为它能够提供有效的定位信息。因此,滑窗优化和回环检测可以结合使用,以提高激光slam后端优化的性能。 ### 回答2: 在激光SLAM的后端优化,滑窗优化和回环检测是两种常用的策略,它们可以结合起来进一步提高SLAM系统的精度和鲁棒性。 首先,滑窗优化是指在SLAM系统的后端优化,不仅考虑当前帧与其前后几帧之间的约束关系,还考虑到之间的某些帧之间的约束关系。这样可以在保证计算效率的前提下,增加更多的约束来提高SLAM系统的精度。滑窗优化可以通过设置一个窗口大小,并且每次添加新的帧时,滑动窗口并更新优化位姿,以维持窗口内的关键帧数量。这样,在滑窗优化的过程,不仅考虑了相邻帧之间的约束,还同时考虑了窗口内部的帧之间的约束。 而回环检测则是指在SLAM系统,通过识别出现在地的重复环境特征,将其作为回环来进行检测和处理。回环检测可以通过特征匹配、相似性度量等方法来实现。一旦检测到回环,系统可以通过优化重新估计历史轨迹和地,并修正之前可能存在的误差。通过回环检测和优化,SLAM系统可以有效地减少误差累积,提高系统的精度和鲁棒性。 将滑窗优化和回环检测结合起来,可以进一步提高激光SLAM后端的优化效果。在滑窗优化的过程,可以考虑回环之间的约束关系,并在优化过程相应地更新和调整位姿。另外,回环检测也可以在滑窗优化发挥作用,检测到回环后进行位姿校正,进一步提升优化效果。 总之,滑窗优化和回环检测在激光SLAM后端优化可以相互结合,通过增加更多约束和修正误差来提高系统的精度和鲁棒性。 ### 回答3: 在激光SLAM后端优化,滑窗优化和回环检测是两种常用的技术方法,它们可以结合使用来提升SLAM系统的优化效果。 首先,回环检测是指通过对机器人在地经过的轨迹进行分析,寻找是否存在已经探索过的区域重新进入的情况。回环检测技术可以通过对激光扫描数据、视觉信息或其他传感器数据进行匹配,从而确定机器人当前所处的位置。回环检测的结果可以用来校正之前路径的误差,并更新地的拓扑结构和机器人位姿。 滑窗优化是一种常用的参数优化方法,它通过维护一个滑动窗口,选择其的一些关键帧进行优化,得到更准确的位姿估计和地重建结果。滑窗优化技术,通常会通过优化(Graph Optimization)方法,以最小化误差函数为目标,对关键帧之间的约束进行求解,从而得到更精确的轨迹和地。 将滑窗优化和回环检测结合可以提高SLAM系统的地构建和路径估计的准确性和鲁棒性。具体步骤如下: 1. 首先,通过激光扫描数据或其他传感器数据进行实时建,并随机选取一些关键帧作为滑窗的初始状态。 2. 在滑窗的窗口滑动过程,当检测到回环时,通过回环检测算法寻找回环帧,并进行回环边的添加。 3. 在回环边添加后,通过优化方法对滑窗内的关键帧和回环边进行优化,以最小化误差。 4. 优化后的结果可以用来更新机器人的位姿估计和地重建。 通过滑窗优化和回环检测的结合,可以实现对系统的闭环误差的消除和路径的校正,从而提高SLAM系统的性能和精度。同时,这种方法也可以减少计算量,提高系统的实时性能。但值得注意的是,滑窗优化和回环检测都有相应的参数和阈值需要调整和设置,才能取得好的优化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值