在SQL中存储多个层次结构

4

我有一个用于分类汽车的层次结构:

                             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个回答

2

是否应该将其视为不同的层次类型...

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
...

或者只需将其规范化为三个表:Cars(汽车)、Colors(颜色)、ColorTones(色调),这样您就可以查询原始数据,然后在代码中生成树形结构循环。请注意保留HTML标签。

+1 这就是我会做的方式。类型列其实并不是必须的,但它可能会有帮助。 - user330315
那么,如果我想添加更多的层次结构,比如燃料类型、车窗数量或其他什么,我需要根据需要添加多次“car1”或“car2”吗?这意味着如果我有10个不同的层次结构,我将有10行“car1”,每行指向不同的父级。是这样吗? - Oliver

2

个人而言,当涉及到在sql中存储层次结构时,我更喜欢使用嵌套集模型。根据你的限制,这种技术有许多变化,并且网络上有很多关于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 正确指出,您的数据库管理系统可能支持递归模型。如果是这样,则可能更适合您的解决方案。这里有一些 Sql Server 的文档。


使用现代支持递归查询的数据库管理系统检索递归模型非常容易(而且更新也很容易)。 - user330315
现代DBMS支持递归查询,尽管我主要使用TSQL,在那里检索大深度的速度比嵌套集慢。但是你说得对,我会编辑并提到这一点,因为它似乎很合适。 - alexb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接