mysql(多级分销)无限极数据库设计方法

闭包表是解决分层存储一个简单而又优雅的解决方案,它记录了表中所有的节点关系,并不仅仅是直接的父子关系。
  在闭包表的设计中,额外创建了一张TreePaths的表(空间换取时间),它包含两列,每一列都是一个指向Comments中的CommentId的外键。

1

2

3

4

5

6

CREATE TABLE Comments(

  CommentId int PK,

  ArticleId int,

  CommentBody int,

  FOREIGN KEY(ArticleId) REFERENCES Articles(Id)

)

  父子关系表:

1

2

3

4

5

6

CREATE TABLE TreePaths(

  ancestor    int,

  descendant int,

  PRIMARY KEY(ancestor,descendant),    --复合主键  FOREIGN KEY (ancestor) REFERENCES Comments(CommentId),

  FOREIGN KEY (descendant) REFERENCES Comments(CommentId)

)

  在这种设计中,Comments表将不再存储树结构,而是将书中的祖先-后代关系存储为TreePaths的一行,即使这两个节点之间不是直接的父子关系;同时还增加一行指向节点自己,理解不了?就是TreePaths表存储了所有祖先-后代的关系的记录。如下图:

  

  Comment表:

  

  TreePaths表:

  

  优点:

  1、查询所有后代节点(查子树):

1

SELECT c.* FROM Comment AS c    INNER JOIN TreePaths t on c.CommentId = t.descendant    WHERE t.ancestor = 4

  结果如下:

  

  2、查询评论6的所有祖先(查祖先树):

1

SELECT c.* FROM Comment AS c    INNER JOIN TreePaths t on c.CommentId = t.ancestor    WHERE t.descendant = 6

  显示结果如下:

  

   3、插入新节点:

  要插入一个新的叶子节点,应首先插入一条自己到自己的关系,然后搜索TreePaths表中后代是评论5的节点,增加该节点与要插入的新节点的"祖先-后代"关系。

  比如下面为插入评论5的一个子节点的TreePaths表语句:

1

2

3

4

INSERT INTO TreePaths(ancestor,descendant)    SELECT t.ancestor,8

    FROM TreePaths AS t    WHERE t.descendant = 5

    UNION ALL

    SELECT 8,8

  执行以后:

  

  至于Comment表那就简单得不说了。

  4、删除叶子节点:

  比如删除叶子节点7,应删除所有TreePaths表中后代为7的行:

1

DELETE FROM TreePaths WHERE descendant = 7

  5、删除子树:

  要删除一颗完整的子树,比如评论4和它的所有后代,可删除所有在TreePaths表中的后代为4的行,以及那些以评论4的后代为后代的行:

1

2

3

DELETE FROM TreePaths

  WHERE descendant 

  IN(SELECT descendant FROM TreePaths WHERE ancestor = 4)

  另外,移动节点,先断开与原祖先的关系,然后与新节点建立关系的SQL语句都不难写。

  另外,闭包表还可以优化,如增加一个path_length字段,自我引用为0,直接子节点为1,再一下层为2,一次类推,查询直接自子节点就变得很简单。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打开dns.37it.cn免费申请二级域名解析方可使用 否则会出现00002993错误 用替换工具ultrareplace,文本编辑工具:Notepad++ 下面是需要替换的地方 ceshi.vvei.cn 超级人脉管家 http://mp.weixin.qq.com/s?__biz=MzA4MTI1OTI1OA==&mid=212268202&idx=1&sn=581c81665c013e1ee5c01db440df2593#rd 这个到时候自己撰写一份新手指南替换 掉 http://123.com/index.php?g=Admin&m=Login&a=index 后台地址 admin admin888 微信管理>>自定义回复 修改 http://ceshi.vvei.cn/ 替换为 你的网站 1、数据库连接地址:Public\Conf\config.php 2、微信菜单修改:Public\Conf\button_config.php,然后“微信管理”-“菜单管理”-“重新生成菜单”。 另下面三行代码请修改: $link_config (还没有关注的,引导关注,点击“立即关注”进入微信文章) $config_good_pic (购买时,页面上面的产品图) $headimgurl (没有购买前的头部左上角LOGO) 3、公众号里面的支付授权目录:直接域名就可以 支付回调URL:直接域名就可以 告警通知URL:先空着 4、更“换推广二维码”图片,图片在根目录保持格式、名字不变。记得在服务器根目录/imgpublic里删除其它多余的图片,只留benbendou.jpg即可。 5、页面的CSS在这里改:Application\Tpl\App\default\Public\Static\css 6、如果头像出不来,可以把根目录的imgpublic文件夹权限设为777 7、微信支付前显示的图片: Application\Tpl\App\default\Public\Static\images\productsinfo.jpg 对应更改的文件:Application\Tpl\App\default\Index\pay.html 8、更改下单时的“备注”内容:Application\Tpl\App\default\Index\index.html 9、关于修改微信关注后回复的内容目录地址: Application\Lib\Action\Admin\WechatAction.class.php 可修改第249,263,267行,可修改中文汉字,不要修改参数代码。 =============================================================== 后台登录:http://您的域名/index.php?g=Admin 初始帐号:admin 密 码:admin888

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值