在sql中存储多个层次结构

时间:2013-01-10 08:27:38

标签: sql database tree hierarchy

我有这个层次来对汽车进行分类:

                             Color
                           /       \
                      Light        Dark
                    /   |   \       /   |   \
                  Red Green Blue  Red Green Blue
                   |    |     |    |    |     |
                 Car1  Car2  Car3 Car4 Car5  Car6

但我也可以拥有这种等级制度:

                             Color
                      /       |       \
                   Red      Green      Blue
                  /   \     /    \     /   \
               Light Dark Light Dark Light Dark
                  |    |     |    |    |     |
                Car1  Car4  Car2 Car5 Car3  Car6

如何在表格中创建这些内容?

我的想法是这样的:

Id | ParentId | ParentId2 | Name
--------------------------------
1    Null         Null       Color
2      1                     Light
3      1                     Dark

但是如果我想添加更多层次结构,添加许多ParentId列似乎不太好。 我想我也会遇到多个父母的问题。

目标是将这些层次结构放在树视图控件中,用户就能够 只需单击按钮即可调用他想要查看的任何层次结构。

谢谢!

2 个答案:

答案 0 :(得分:2)

就个人存储在sql中的层次结构而言,我个人更喜欢nested sets。根据您的约束,该技术有很多变化,网上有很多关于CRUD sql例程的资源。

我必须说,当你有大树时,你会在创建/更新/删除顶级父母时有一个小的性能损失,但是当你阅读时你有很好的表现,我认为这比你有一个递归模型更受欢迎另一种方式。

修改

我看到了多个父问题。我建议通过合并第二和第三级来改变你的方法。你会有像

这样的东西
**Node**      |       **Left**      |     **Right**      |     **Level**
Color                 1                   26                   1
LightRed              2                   5                    2
LightGreen            6                   9                    2
LightBlue             10                  13                   2
DarkRed               14                  17                   2
DarkGreen             18                  21                   2
DarkBlue              22                  25                   2
Car1                  3                   4                    3
Car2                  7                   8                    3
Car3                  11                  12                   3
Car4                  15                  16                   3
Car5                  19                  20                   3
Car6                  23                  24                   3

获取所有具有颜色的汽车的查询将类似于

select * 
from hierarchy
where left > 1 and right < 26 and level = 3

编辑2:

a-horse-with-no-name正确指出您的DBMS可能支持递归模型。如果是这样,那么它可能是一个更好的解决方案。 Here是Sql Server的一些文档。

答案 1 :(得分:1)

它应该被视为不同的层次结构类型......

Id | ParentId | Type | Name
--------------------------------
1    Null         1      Color
2      1          1       Light
3      1          1       Dark
4    Null         2      Color
5      4          2       Red
6      4          2       Green
7      4          2       Blue
8      5          2       Light
...

或者只是标准化为3个表:汽车,颜色,色调

因此,您可以查询原始数据,然后在代码中生成树结构循环。