使用层次结构/子类别设计SQL表

使用层次结构/子类别设计SQL表,sql,normalization,categorization,Sql,Normalization,Categorization,我有一张像这样的桌子: ID |关键字|类别|子类别|子类别|子类别 是否需要将其拆分为两个表(关键字表和具有父id的类别表) 如果一个关键字只能属于一个类别、子类别…等等。意思是没有重复。仍然需要将其拆分吗?您只需要一个表来表示1-1映射。要表示1-many或多个映射,应使用多个表 如果关键字只能对应于一个类别/子类别/子类别,则当前布局应该可以 一个警告:如果您想基于关键字进行搜索,分离表可能会提高性能。执行整数搜索要快得多 在另一个表中存储关键字值的讨论大体上与在另一个表中存储国家名称(主

我有一张像这样的桌子:

ID |关键字|类别|子类别|子类别|子类别

是否需要将其拆分为两个表(关键字表和具有父id的类别表)
如果一个关键字只能属于一个类别、子类别…等等。意思是没有重复。仍然需要将其拆分吗?

您只需要一个表来表示1-1映射。要表示1-many或多个映射,应使用多个表

如果关键字只能对应于一个类别/子类别/子类别,则当前布局应该可以

一个警告:如果您想基于关键字进行搜索,分离表可能会提高性能。执行整数搜索要快得多


在另一个表中存储关键字值的讨论大体上与在另一个表中存储国家名称(主要是静态的)的讨论相对应。使用另一个表的一些关键优势可能是(口语)语言独立性、快速搜索和以后易于更新。

我会使用这样的两个表

   Categories
-------------------
PK,FK1 | CategoryID
       | Keyword 
       | Category 

  SubCategories
--------------------
PK,FK1 | CategoryID
PK,FK1 | SubCategoryID

如果您希望以后重命名或重新排列您的类别,则将其拆分可能有意义:

  • 如果保持原样,则必须对该表中包含(((子)子)子类别的每一行执行重命名/重新组织步骤(更改类别/子类别/子类别/子类别字段)。这将导致更复杂的查询,如果此关键字表中有很多行,则可能是性能问题(=数据库需要一段时间才能完成);另一方面,查询(读取)将尽可能快
  • 如果将其拆分,则更新(((sub)sub)category只需对较少的行执行,但查询(read)将花费更长的时间,因为它必须处理两个(或更多)表

权衡两者的利弊,然后做出决定。m

为什么不在PK中添加ParentID列和FK?

我会在两个表中进行此操作,每个外键来自Categories表:

Keywords 
id (PK)
keyword
category_id (FK)

Categories
category_id (PK)
category
parent_category_id (FK)
类别表中的数据如下所示:

category_id    category    parent_category_id
1              Food        null
2              meat        1
3              organic     1
4              fruit       3
id     keyword    category_id
1      grapes     4
2      chicken    2
关键字表中的数据如下所示:

category_id    category    parent_category_id
1              Food        null
2              meat        1
3              organic     1
4              fruit       3
id     keyword    category_id
1      grapes     4
2      chicken    2

这太棒了!谢谢根据另一个答案,我将根据性能将其拆分,并遵循您的设计。