设计具有层次结构/子类别的SQL表

时间:2010-01-22 22:05:09

标签: sql normalization categorization

我有一张看起来像这样的表:

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

我是否需要将其拆分为两个表(关键字表和具有父ID的类别表) 如果一个关键字只能属于一个类别,子类别......等等。意思是没有重复。是否还需要拆分它?

5 个答案:

答案 0 :(得分:6)

我会在两个表中执行此操作,每个外键来自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

答案 1 :(得分:5)

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

如果关键字只能对应一个类别/子类别/子子类别,那么您当前的布局应该没问题。

有一点需要注意:如果您想根据关键字进行搜索,则可以在分离表格时获得性能提升。执行整数搜索要快得多。

将关键字值存储在另一个表中的讨论粗略地对应于另一个表中存储的国家/地区名称(大多数是静态的)this discussion。使用另一个表的一些关键优势可能是(口语)语言独立性,快速搜索以及以后易于更新等。

答案 2 :(得分:1)

我会使用这样的两个表。

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

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

答案 3 :(得分:1)

将它拆分如果您希望稍后重命名或重新排列类别可能是有意义的:

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

权衡两者的缺点和优点,然后做出决定.m

答案 4 :(得分:1)

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