2009-12-18 59 views
0

我正在重組分類MySQL數據庫,其中不同的主要部分分爲不同的表格。例如,銷售物品有自己的具有唯一ID的表格,作業有自己的具有唯一ID的表格,個人用戶也有自己的表格。高效的分類的Mysql結構

這些部分都共享一些共同的特點:

-id
-title
體區
-listing狀態
-poster
-reply電子郵件
-posting日期

但他們每個人都有一些單獨的信​​息:

- 每個類別都有不同的樹和類別可供選擇(它們會影響存儲它們的結構)
-jobs需要存儲諸如工資,開始日期等的東西
-sale物品需要存儲類似價格,敖包等

因此,這是一個更好的做法重構數據庫,而我可以通用表來存儲所有常規列表信息,無論節,然後任務出定制數據存儲到小表,或者更好地離開當前結構並將各部分分開?

回答

0

請勿使用單個表格。去關係。

我建議設置一個所謂的「主」表(具有共同特徵的表)和三個包含特定信息的表之間的多態關係。該結構將是這個樣子:

主表

  • ID
  • 標題
  • ...
  • CATEGORY_NAME(VARCHAR或CHAR)
  • CATEGORY_ID(整數)

分類表

  • ID
  • (具體列)

對於類別字段應包含的具體類別表,例如表名。'job_category',而category_id應指向類別表中的ID。一個例子是這樣的:

# MAIN TABLE 
id | title   | ... | category_name | category_id 
------------------------------------------------------- 
123 | Some title | ... | job_category | 345 
321 | Another title | ... | sale_category | 543 

# SPECIFIC TABLE (job_category) 
id | ... 
--------- 
345 | ... 

# SPECIFIC TABLE (sale_category) 
id | ... 
--------- 
543 | ... 

現在,每當您查詢的主表,你會馬上知道哪個表來從附加數據,你就知道該表中的ID。此方法唯一的缺點是您必須執行兩個單獨的查詢才能獲取單個項目的信息。但是,這可能會在交易中實現。另一方面,對於通過其他方式獲取數據(例如,搜索jobs_category中的某些內容),可以使用JOIN從主表中獲取關聯數據。請記住,不僅要加入main.category_id = jobs_category.id,還要使用category_name列作爲連接條件。否則,您可能會獲取屬於其他類別之一的數據。

爲了獲得最佳性能,您可能需要索引category_name和category_id列。如前一段所述,這大多會加快加入這兩個表的任何查詢。

希望這會有所幫助!

2

聽起來他們都是獨立的實體,彼此無關(ecxept用於共享某些列定義),對吧?

你曾經想要做一個SELECT像

SELECT * 
FROM main_entity 
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')? 

否則,我不認爲我會合併成一個表。