如何在MySQL中设计类别和子类别?

6

我有一个分类列表,每个分类都关联着一些子分类。假设分类表的名称是“Cat”,其中包含了“热”和“冷”这两个分类。我还有另外一张名为“subcats”的表,其中包含以下内容:

Cat:

 ID Name
 1 Hot
 2 Cold

SubCats:

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

我在设计中应该考虑性能,你认为我的设计如何?是否有更好的解决方案?

(类别只是样例 - 我有大量的类别和子类别。)


它可以有子子类别吗? - Elbek
好问题,不仅仅是类别,但如果我有子子类别,答案会是什么呢? - Eme Emertana
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
您可以将所有内容都放在一个名为“category”的表中,然后添加一个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

Alexandre Nierenbe,感谢您的回答,能否给我一个例子?您对我的解决方案有什么想法? - Eme Emertana
第三和第四级别的类别可以使用产品标签来完成,查看这个我是正确的吗? - Shaiju T

3

3
那篇Mike Hillyer的文章很棒。我想它曾经在MySQL开发者博客上发布过。 - Tor Valamo
我第一次在那里读到它是大约一年半前。它绝对是太棒了 :) - JustDanyul

2
您的表结构没有什么问题。它已经规范化并以标准方式实现。如果您还没有这样做,可能最好在表格之间设置外键约束。但正如Zeke所说,您的设计不支持多级子类别,但只要您知道只会有类别和子类别,那就没问题了。如果您确实想要“子子类别”(无限程度),您可能只需要一个像这样的表: Cat:
CatID ParentCatID Name
1     null        Hot
2     1           Soup
3     1           Coffee
4     3           Decaf Coffee
5     null        Cold
6     5           Iced Tea
请注意,咖啡的父级ID是“热”而无咖啡因咖啡的ParentID是“咖啡”。因此,热>咖啡>无咖啡因咖啡。任何父级类别ID为null的内容都将成为顶级类别。 您可以有一个引用自身表格的外键。因此,您可以在ParentCatID和CatID之间创建外键。

第三和第四级别的类别可以使用产品标签来完成,查看这个我是正确的吗? - Shaiju T

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