管理员可以创建多个类别和子类别。
例如管理员可以:
id title parent_cat_id
1 cat1 0
2 sub1 1
3 sub2 1
3 sub3 1
4 sub3_1 3
5 sub3_2 3
6 sub3_2_1 5
7 sub3_2_2 5
...
我不知道什么是最佳选择?我应该一张桌子还是两张桌子?
这就是我所知道的:
apktool
答案 0 :(得分:2)
类别和子类别都只是逻辑'类别'因此,除非您的设计有特定的要求,否则不需要实施多个物理表(尽管我现在无法想到......)。
此外,您无需为层次结构中的每个级别专门设置结构;一个表格,自我参照联接回到每个类别的父母' (或者'子类别')级别就是您所需要的。
我在此示例中假设您的类别(或子类别)可能包含以下元素:
// categories table
category_id
category_name
element
parent_category_id
此解决方案非常优雅,允许扩展层次结构而无需更改表格。
顶级类别的DML是使用谓词" parent_category_id IS NULL"。
较低级别类别(或子类别)的DML是使用谓词" parent_category_id ='无论父类别ID是'"。
干杯 斯科特
P.S。我没有足够的代表回复Sherif的回答目录,我可能(可能是读)错过了一些东西,但修改后的预订横向(或嵌套集)也可以用一个表来实现;方法和与Adjancey列表的比较在this document
中有详细描述我同意谢里夫所描述的每种方法的利弊。
答案 1 :(得分:1)
Best是一个相对术语,但我们当然可以探索在关系DBMS中存储分层数据结构的可用解决方案的权衡。关系数据库往往是扁平结构,因为它们通常被归一化为二维表,由对行感兴趣的列组成。这使得嵌套结构的想法很难存储在这样的数据库中。
在关系数据库中存储这种类型的数据有两种常用方法。具体而言,作为邻接列表,或使用修改后的序列遍历。
现在,在具体情况下,如果您在title
和id
存储的表中有parent_id
列,则无关紧要,因为您完全依赖于parent_id
的主键。
邻接列表方法类似于您在问题中提出的方法。您不需要两个表来执行此操作,因为您使用id
和parent_id
字段作为adjacency list来组合和分解结构。
前序遍历确实需要使用两个表(一个用于存储categery名称或title
在您的情况下,一个用于存储父项与其子项的关系)。您需要存储每个父节点的id
和parent_id
子节点,而不是在每行中存储left
和right
。
categories table ---------------- id title 1 cat1 2 subcat1_1 3 subcat1_2 4 subcat1_2_1 Relationship table ------------------ parent_id left right ------------------------------ 1 2 3 3 4 NULL