类别和子类别表结构 - mysql

时间:2016-09-04 03:40:27

标签: php mysql

管理员可以创建多个类别和子类别。

例如管理员可以:

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

2 个答案:

答案 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中存储分层数据结构的可用解决方案的权衡。关系数据库往往是扁平结构,因为它们通常被归一化为二维表,由对行感兴趣的列组成。这使得嵌套结构的想法很难存储在这样的数据库中。

在关系数据库中存储这种类型的数据有两种常用方法。具体而言,作为邻接列表,或使用修改后的序列遍历

  • 附属清单方法

    • 赞成

      • 易于实施和理解
      • 您可以轻松地将大型子类别迁移到另一个父类别
      • 无论结构有多大,都不会给数据库写入巨大的成本
    • 缺点

      • 读取的成本要高得多(需要大量的迭代/递归来重建结构
      • 在SQL中容易破解数据(SQL不做递归)
  • 使用前序遍历

    • 赞成

      • 更容易在SQL中找到所有父母
      • 更容易破坏SQL中的数据
      • 构建整棵树的成本更低
    • 缺点

      • 稍微难以实施
      • 随着结构的深入,插入/更新的成本会增加

现在,在具体情况下,如果您在titleid存储的表中有parent_id列,则无关紧要,因为您完全依赖于parent_id的主键。

邻接列表方法类似于您在问题中提出的方法。您不需要两个表来执行此操作,因为您使用idparent_id字段作为adjacency list来组合和分解结构。

前序遍历确实需要使用两个表(一个用于存储categery名称或title在您的情况下,一个用于存储父项与其子项的关系)。您需要存储每个父节点的idparent_id子节点,而不是在每行中存储leftright

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