2010-01-22 55 views
5

我有一个如下所示的表:设计具有层次结构/子类别的SQL表

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

是否需要将它分成两个表格(关键字表格和具有父级ID的类别表格) 如果一个关键字只能属于一个类别,子类别...等等这意味着没有重复。是否仍然需要将其拆分?

回答

5

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

如果关键字只能对应一个类别/子类别/子子类,你当前的布局应该罚款。

一个告诫:如果您想根据关键字进行搜索,可能会有性能提升分离表。执行整数搜索要快得多。

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

1

我会使用这样的两个表。

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

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

这可能是有意义的它分裂如果你希望重命名或稍后重新安排类别:

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

权衡两者的缺点和优点,然后作出decision.m

1

为什么不只是添加PARENTID列和FK的PK?

6

我会与每个外键从分类表来做到这一点在两个表:

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 
+0

这太好了!谢谢。基于其他答案,我会分解它的性能和遵循你的设计。 – chips 2010-01-24 00:08:04