实现目标
1,任何上级查到所有下级,包括下级的下级
2,任何下级查到所有上级,包括上级的上级
3,查询下级或者上级,可以过滤类型
4,可以局部,快速精确的更改父子关系,包括增加,修改,删除操作.
5,找到节点后web自动展开父级树
6,关联数据库查询方便
7,比采用左右节点等各种节点ID方式要实用, 因为本文方法在增加节点/删除节点时, 只影响父子关系, 不影响其它值.
8, 此树永远都不需要重新生成, 只需要随意增/删节点, 当然前提是你的逻辑代码没有bug, 所有实体发生变化时都同步到树.
理想树的表结构(TREE_TABLE)
字段名 | 描述 | 数据类型 | 键 | 空 | 备注 |
TREE_ID | 树节点流水号 | NUMBER(10) | Y | N | 唯一流水编号,仅用于方便定位,更新,删除 注意: 不要用节点流水号来做父子关系, 因为每次生成新树时流水号都不同, 导致业务处理非常麻烦; |
DESCRB | 树节点描述 | VARCHAR(64) |
| N | |
OBJ_ID | 实体对象id | NUMBER(10) | Y2 | N | 系统对象ID |
PAR_ID | 父级对象ID | NUMBER(10) | Y2 | N | 系统对象ID, 根据节点的父级为-1 |
OBJ_TYPE | 实体对象类型 | NUMBER(6) |
| N | |
PAR_TYPE | 父级对象类型 | NUMBER(6) |
| N | |
CHILD_SN | 子对象序号 | NUMBER(6) |
| N | 每个父对象的子对象序号, 从0开始,生成之后不允许改变,用于简化的全路经 |
OBJ_ATTR1 | 实体对象属性1 | NUMBER(6) |
| 复制对象属性值常用于过滤,查询 | |
OBJ_ATTR2 | 实体对象属性2 | NUMBER(6) |
| 复制对象属性值常用于过滤,查询 | |
OBJ_ATTR3 | 实体对象属性3 | NUMBER(6) |
| 复制对象属性值常用于过滤,查询 | |
PATH_ID | 树节点全路经ID | VARCHAR(160) | Y3 | N | 设计最多12级 格式: 父级[PATH_ID].[OBJ_ID]. 12650.12651.12652.12653.12664. 12655.12656.12657.12658.12659. |
PATH_SN | 树节点全路经序号 | VARCHAR(160) | Y4 | N | 设计最多12级,简化的全路经 格式: 父级[PATH_SN].[CHILD_SN]. 1.2.3.10.22.101.10123.77.2.99. |
TV_UPDATE | 记录更新时间 | NUMBER(13) |
| N | 时间毫秒值 |
最常用方式说明:
1,任何上级查到所有下级,包括下级的下级
SELECT * FROM TREE_TABLE WHERE PATH_SN LIKE '1.2.%'
说明: PATH_SN 长度比较短, 消耗时间比用 PATH_ID短, 效率上比较高.
2,任何下级查到所有上级,包括上级的上级
代码可以从[PATH_ID]字段可以解释出所有父对象ID; 或者SQL:
SELECT * FROM TREE_TABLE WHERE PATH_ID LIKE '%.12659.' AND OBJ_TYPE IN (1001,1002)
查父节点时不能用PATH_SN 因为可能其它节点会重复, 所以用 PATH_ID,
说明: PATH_ID 长度比较长, 消耗时间比用 PATH_SN长.
3,查询下级,可以过滤类型
SELECT * FROM TREE_TABLE WHERE PATH_SN LIKE '1.2.%' AND OBJ_TYPE IN (3001,3002)
4,可以局部,快速精确的更改父子关系,包括增加,修改,删除操作.
增加子节点: 只要生成CHILD_SN/PATH_ID/PATH_SN 等字段就可以完成增加操作
修改本节点: 只要同步OBJ_ATTR1, OBJ_ATTR2, OBJ_ATTR3 其它都不要变化
更改父节点: 需要把子节点的全路经修改掉, 查出所有子节点,然后替换好[PATH_ID],[PATH_SN]子段,最后根据TREE_ID 更新数据库.
SELECT * FROM TREE_TABLE WHERE PATH_ID LIKE '12650.12651.%'
UPDATE TREE_TABLE SET PATH_ID =?,PATH_SN =?,TV_UPDATE=? WHERE TREE_ID=?
删除本节点: 1,删除本节点,2删除所有子节点
5,找到节点后web自动展开父级树
代码从[PATH_ID]字段可以解释出所有父对象ID,然后按顺序展开
6, 普通的树表会失去很多关系数据库的功能, 关联查询非常不方便, 此树可以关联查询,
TREE_TABLE 可以方便的与其它表关联查询, 非常方便, 解决了用 IN (ID...) 的问题