2012-11-24 48 views
2

(在mysql數據庫上),我想要一個包含不同變量的表格,例如不同的語言,例如,文本方向,名字始終是首字母大寫,我應該如何編碼鏈接等等。如何高效地存儲此語言設置數據?

一個人會想到這是這樣的:

id | lng | text direction | url encode | 1st letter cap | 
--------------------------------------------------------- 
1 | en | ltr   | 0   | 1    | 
2 | he | rtl   | 1   | 0    | 
3 | fr | ltr   | 1   | 1    | 

可是這樣我可能會發現我不得不添加更多的列,我明白這不是很好數據庫設計。另一種選擇是維持「ID」和「LNG」,然後將此表的固定2列的表:

lng id | var   | val | 
------------------------------- 
1  | text direction | ltr | 
1  | url encode  | 0 | 
1  | 1st letter cap | 1 | 
2  | text direction | rtl | 
(and so on) 

,或者甚至三個表:語言名稱和ID,VAR名稱和ID,並上表 - 當用var id替換var文本描述時。

我甚至可能要忘記存儲VAR的文字說明,只是使用IDS照片直接當我查詢,但這次好好嘗試一下似乎很人性化。

這是要走的路?

回答

0

你的第二個例子是使用Attribute-Value Model。如果(正如你所說),你需要經常添加更多的列和/或如果大多數實體並不需要所有列,否則會被留下他們NULL它可以是有用的。

的缺點是它使查詢更復雜的寫,這就是爲什麼我會盡量避免它儘可能 - 我覺得簡單,更重要的是擔心其在一段時間一次添加一列。除非需要頻繁添加新列,例如,如果最終用戶需要在運行時添加新字段,那麼我會選擇第一個選項 - 一個包含語言屬性和外鍵的語言表,以便每當您需要它。您可能甚至不需要id列,只需使用lng作爲自然鍵。

無模式數據庫MongoDB中一樣處理這個問題好多了。它沒有列的概念,所以你可以在任何時候開始存儲新數據,如果你有一個實體不需要所有你沒有指定它們的字段。

-1

您可以嘗試JSON格式編碼,所以你會碰到這樣的

id | value 
------------------ 
1 | { "lng":"en" , "text direction":"ltr" , .... } 

這將需要最少列

+1

若你需要,雖然對任意字段的查詢。我通常會建議不要試圖將MySQL轉換爲MongoDB。 – theon