数据库表设计(邻接表、路径枚举、嵌套集、闭包表)

 1.邻接表

 用邻接表记录这个评论的数据(comments 表):

comment_idparent_idauthorcomment
10小明我不大认同这个观点
21小张我也不认同
32小红我同意楼上
41小全你为什么不认同呢
54小明我以前遇到过这情况
65小张那也不代表你所说是对的
75小新这个视情况而定吧

  

 这种表设计,查询所有子节点和所有父节点非常痛苦

2.路径枚举

comment_idpathauthorcomment
11小明我不大认同这个观点
21/2小张我也不认同
31/2/3小红我同意楼上
41/4小全你为什么不认同呢
51/4/5小明我以前遇到过这情况
61/4/5/6小张那也不代表你所说是对的
71/4/5/7小新这个视情况而定吧
--查询所有父节点
SELECT * FROM comments AS c WHERE '1/4/5/7' LIKE c.path + '%' ;
--查询所有子节点
SELECT * FROM comemnts AS c WHERE c.path LIKE '1/4' + '%' ;

路径枚举也存在一些缺点,比如数据库不能确保路径的格式总是正确或者路径中的节点确实存在。依赖于应用程序的逻辑代码来维护路径的字符串,并且验证字符串的正确性开销很大。无论将varchar 的长度设定为多大,依旧存在长度的限制,因而并不能够支持树结构无限扩展。

3.闭包表

comment_idparent_idauthorcomment
10小明我不大认同这个观点
21小张我也不认同
32小红我同意楼上
41小全你为什么不认同呢
54小明我以前遇到过这情况
65小张那也不代表你所说是对的
75小新这个视情况而定吧

 

parent_idson_id
11
12
13
14
15
16
17

 

 

--查询所有父节点
SELECT c.* FROM comments AS c
    INNER JOIN commentst t on c.son_id = t.son_id
    WHERE t.son_id = 1
--查询所有子节点
SELECT c.* FROM comments AS c
    INNER JOIN commentst t on c.son_id = t.parent_id
    WHERE t.parent_id = 1
--新增节点
INSERT INTO comments(parent_id,son_id)
    SELECT t.parent_id,8
    FROM commentst AS t
    WHERE t.ContentId = 7
    UNION ALL
    SELECT 8,8
--删除节点
DELETE comments WHERE comment_id=8
DELETE commentst WHERE parent_id=8

 

转载于:https://www.cnblogs.com/lgxlsm/p/7486412.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值