我需要对与黄金页面有点类似的东西实现分类和子分类。
假设我有下表:
CategoryId, Title
10, Home
20, Business
30, Hobbies
我有两个选项来编码子分类。
CategoryId, SubCategoryId, Title
10, 100, Gardening
10, 110, Kitchen
10, 120, ...
20, 100, Development
20, 110, Marketing
20, 120, ...
30, 100, Soccer
30, 110, Reading
30, 120, ...
CategoryId, SubCategoryId, Title
10, 100, Gardening
10, 110, Kitchen
10, 120, ...
20, 130, Development
20, 140, Marketing
20, 150, ...
30, 160, Soccer
30, 170, Reading
30, 180, ...
选项2听起来更容易从表中获取行例如:SELECT BizTitle FROM tblBiz WHERE SubCatId = 170
而使用选项1,我必须写这样的东西:
SELECT BizTitle FROM tblBiz WHERE CatId = 30 AND SubCatId = 170
即含有额外的AND
但是,选项1更容易手动维护(当我需要更新和插入新的子类别等时,在我看来它更令人愉悦。
有什么想法吗?选项2在效率方面是否值得麻烦?有没有与这个常见问题相关的设计模式?
我会用这个结构:
ParentId, CategoryId, Title
null, 1, Home
null, 2, Business
null, 3, Hobbies
1, 4, Gardening
1, 5, Kitchen
1, 6, ...
2, 7, Development
2, 8, Marketing
2, 9, ...
3, 10, Soccer
3, 11, Reading
3, 12, ...
详细地:
IDENTITY
或类似),以便您可以拥有超过10个子类别只要您只使用两个级别的类别,您仍然可以选择如下:
SELECT BizTitle FROM tblBiz WHERE ParentId = 3 AND CategoryId = 11
SQL服务器的新hierarchyid
功能看起来很有前途:https://msdn.microsoft.com/en-us/library/bb677173.aspx
我不喜欢嵌套集模型:
parent
字段与外键约束结合使用,则很容易产生禁止的不一致。
如果rght
低于lft
,则会出现不一致
如果某个值出现在几个rght
或lft
字段中,则会出现不一致
如果您创建差距,则可能会出现不一致
如果您创建重叠,则可能会出现不一致我建议使用选项1 - 保持子类别在类别中唯一。假设我有两类不相关的项目:
对于每个我想要一个子类别
请注意,Orange是每个类别中的子类别。虽然名称相同,但它的功能却截然不同。 (我们没有考虑到橙色水果是橙色的可能性)
有了这个设计,如果有人改变主意并希望将Orange重命名为Oranges,那很好。在不影响颜色下的橙色子类别的情况下更改很容易。
如果您的UI构建方式使Marketing可以控制Colors的子类别而Production可以控制Fruits的子类别,则此设计将允许Marketing使用其子类别而不会超越Production的子类别。