2010-01-22 98 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