理想树表结构数据库存储方案

实现目标

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...) 的问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值