实现目标
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...) 的问题