2013-10-31 36 views
0

我曾經在一個項目,一定程度上有一個表像這樣的工作:效益上分割數據在MySQL表

tbl_texts 
id, item_id, item, type, lang, value 
1, 44, 'product', 'name', 'en', 'Product Name' 
2, 44, 'product', 'description', 'en', 'Product description' 
3, 55, 'category', 'name', 'en', 'Category name' 
4, 55, 'category', 'name', 'fi', 'Category finnish name' 

出了6場,1是主鍵和4是一個組合索引。從未使用主鍵選擇數據。 Item_id,item,type,lang索引總是被使用。

1)我想知道這是存儲數據的好方法還是壞方法?

2)它是壞的設計有,你必須加入一個表兩次(櫃面你想要的名稱和產品的描述)。

3)我應該將數據分離,以表喜歡這些:

tbl_product_texts 
id, product_id, type, lang, value 

tbl_category_texts 

(etc.) 

4)或這樣的:

tbl_product_names 
id, product_id, lang, name 

tbl_product_descriptions 
id, product_id, lang, description 

(etc.) 

5),或者甚至是這樣的:

tbl_product_names_en 
id, product_id, name 

tbl_product_descriptions_en 
id, product_id, description 

(etc.) 

我真的很困惑,這是最好的方式來做到這一點。

+0

。 。存儲數據的方式應該如何使用數據(加載,維護,查詢)。對於所有情況,不一定有「最佳」方法,而且您的問題不包含有關數據如何使用的信息。 –

+0

它非常依賴於這些結構是如何動態的。如果你有相當長的時間有產品名稱和產品描述,那麼他們會更好的兩列。但是,如果類別經常添加或者可以通過管理前端添加,那麼您提供的結構是必需的。 – flaschenpost

回答

1

存儲數據的'最佳'方式是一個非常開放的問題。在設計數據存儲模式時,您需要考慮多個方面:

  • 您的數據是如何訪問的? (查詢優化)
  • 您的數據是如何創建的?
  • 您的數據庫模式未來可能發生變化的可能性有多大?

維基百科上的數據規範化這裏的好文章:http://en.wikipedia.org/wiki/Database_normalization

我個人創建表,使基於基礎數據的意義。如果產品與類別足夠不同,那麼我會將它們存儲在不同的表格中。雖然您只提供了一小部分數據樣本,但我會假定每個產品都有多個名稱和說明,但每種語言只有一個條目。這樣,您將有以下:

Products: 
    PK: id 
    ...other columns that each product only has a single value for (price for example) 

Product_Texts: 
    PK,FK: product_id 
    PK: language 
     name 
     description 

(PK - 主鍵,FK - 外鍵)

如果再有一個搜索名稱或描述查詢,那麼你可以考慮進一步增加鍵這些字段按要求。

+0

有了這個解決方案,如果我想要一個產品的名稱和描述,我必須加入表格兩次。這是不錯的設計? – unska

+0

爲什麼你需要加入兩次?單個連接應足以同時爲單個產品ID和語言提供名稱和說明:SELECT * FROM Products AS p LEFT JOIN Product_Texts AS pt ON p.id = pt.product_id WHERE p.id = 1 and pt.language = '英語'。 – ModulusJoe

0

這是否是一個不好的實現取決於你想要做什麼。這看起來像是爲項目,類型和語言的可變組合而設計的。唯一突出的是項目列,由於您已經擁有item_id,因此可能不需要該列。

如果當前執行工作以及對性能沒有問題,有可能是沒有必要改變什麼。畢竟,改善目前的狀況需要時間,可能會更好地解決重要問題或構建新功能。

如果此設置導致問題,您必須查看您的要求。例如,如果你知道有可能的類型始終存在於每個項目的固定量,這可能是一個解決方案(例如只有兩種可能的類型):

tbl_texts 
id, item_id, item, lang, name_value, desc_value 
1, 44, 'product', 'en', 'Product Name', 'Product description' 
3, 55, 'category', 'en', 'Category name', 'Category description' 
4, 55, 'category', 'fi', 'Category finnish name', 'Category finnish description' 

,你將有一半的記錄量並且刪除了一個搜索標準,抵消了添加的額外列。多種可選類型可能會使此解決方案變得更糟,而未知數量的類型將使其變得不可能。