5

我有一个类别列表和与每个类别相关的子类别数量。假设类别表称为 Cat 然后我在其中有冷热类别我有另一个名为 subcats 的表然后我有以下内容:

 ID Name
 1 Hot
 2 Cold

子猫

SubCatID   CATID   Name
  1       1        soup 
  2       1       rice 
  3       1       pizza 
  4       2       salad 
  5       2       fruit

我应该在我的设计中考虑性能,你如何评价我的设计?有没有更好的解决方案?

(类别只是示例 - 我有很多类别和子类别。)

4

3 回答 3

3

如果您使用 mysql 和/或 sqlite(您的标签中都有),不提供任何用于递归查询的构造,那么您可能会更好地使用嵌套集模型而不是父/子关系。

它可能非常过分,或者它可能不适合目的(如果它的插入比读取更重),但尽管如此,学习它很有趣,所以请阅读这些

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

http://en.wikipedia.org/wiki/Nested_set_model

于 2012-09-29T00:52:32.733 回答
3

您可以将所有内容放在一个表中,类别。然后有一个 parentID 列。如果parentID = 0,它是一个主类别,如果它是另一个ID,那么它是一个子类别?这种结构将支持子子类别......不确定这是否对您有帮助。

示例字段:

Table: category
categoryID
parentID
name

示例数据:

categoryID : 1
parentID : 0
name : hot

categoryID : 2
parentID : 0
name: cold

categoryID : 3
parentID : 2
name : a soup that's cold

categoryID : 4
parentID: 1
name: a soup that's hot
于 2012-09-29T00:45:26.010 回答
2

您的表结构确实没有问题。它已经很好地标准化,并且您已经以标准方式实现了它。跨表使用外键约束可能是个好主意(如果您还没有)。

然而,正如 Zeke 所说,您的设计不会支持多个级别的子类别,但只要您知道只有类别和子类别,就可以了。

如果您确实想要“子子类别”(无限程度),您可能只想要一个像这样的表:

猫:

CatID ParentCatID Name
1     null        Hot
2     1           Soup
3     1           Coffee
4     3           Decaf Coffee
5     null        Cold
6     5           Iced Tea

请注意,Coffee 的父 ID 是“Hot”,而 Decaf Coffee 的 ParentID 是“Coffee”。太热了>咖啡>无咖啡因咖啡。ParentCatID 为 null 的任何内容都将是顶级类别。

您可以拥有一个引用它自己的表的外键。因此,您可以在 ParentCatID 和 CatID 之间创建一个外键。

于 2012-09-29T00:50:15.323 回答