想象一下一棵树。我想追溯到给定树上任何分支的树的主干,分支中的分支数量是无限的。没有多对多的连接。
我正在记录客户,并建立了一个表来显示哪个现有客户向我们推荐了一个新客户,所以这已经扩展到了某种程度上的“家谱”。
每次有新客户加入时,我都需要知道启动一切的树原点的原始客户。
这是我的表格的一个模型,显示了2个“家庭”,其中1和11是每个家庭的树的顶部。在本例中,每个父级都有两个子级,每个编号都是客户合同号的外键。
parents children
1 2
1 3
2 4
2 5
3 6
3 7
11 12
11 13
12 14
12 15
13 16
13 17到目前为止,我一直在使用MySQL和一个PHP循环来选择一个具有特定合同号的父项,然后查看该父项是否是同一个表中的子项。我继续这个循环,直到没有返回任何行,并且我得到了答案。
我的问题是,这是最有效的方法吗,或者在PHP之外有解决方案,或者通过重新设计表?我可以看到很快就会有成百上千的“代”,我不希望它开始变得太慢。
发布于 2015-07-21 20:18:29
你要找的是Nested set model。它允许在关系数据库中存储分层数据。
看看这个answer,它会告诉你如何找到任何记录的origin。
发布于 2015-07-22 01:10:56
Bill Karwin做了一个很棒的幻灯片,叫做SQL Antipatterns Strike Back。从幻灯片48开始,主题转向处理树的技术。
就我个人而言,我喜欢闭合表技术。它易于查询,效率高,使用正确的触发器,无需维护。
https://stackoverflow.com/questions/31538286
复制相似问题