2010-05-31 77 views
1

我想添加動態列在MySQL表中,但我不知道如何。mysql表中的動態列?

我想讓用戶在線程中添加一些列(字段),例如。讓他添加一個整數字段和一個值(例如price:199)或一個字符串字段和一個值(例如名字:teddybear)。

用戶可以根據需要添加任意數量的字段/值對。

我以爲我可以創造一個多到多表:

線程< - > thread_field < - >字段

thread: id, title 
thread_field: field_id, thread_id, value 
field: id, name 

這是一個好的結構?

但是這樣我就必須設置一個特定的列類型的thread_field.value。無論是整數還是字符串。我想有可能讓它動態,讓用戶選擇。

我該怎麼做?

謝謝!

回答

1

此問題出現了非常頻繁與問候到關係數據庫。它是關係的定義的一部分,它具有固定的一組屬性,而不是動態屬性。

如果您需要在關係數據庫中允許用戶定義的屬性,最簡單的解決方案是存儲Serialized BLOB,如XML或其他半結構化格式(JSON,YAML)。你失去了使用SQL高效查詢這種能力(除非你使用擴展SQL和XML函數和索引的RDBMS),但是無論你如何解決這個問題,你都會犧牲RDBMS的許多功能。

另一種方法是使用新的non-relational data stores之一像CouchDBMongoDB,這使得它容易與動態,strucutred屬性來擴展實體,而其餘稍微有效。

3

醜陋的方式:

thread_field:FIELD_ID,thread_id單,value_text,value_int

其中value_text聲明TEXT和value_int聲明INT。

對於任何給定的條目,您只使用這兩個字段中的一個。

+0

什麼是好看的方式?=) – 2010-05-31 19:40:42

+0

我不知道:) 實際上,MySQL可以在文本字段中存儲INT,所以您可能只需要一個文本字段。 你甚至可以使用「SORT BY colname + 0」在文本字段中按INT進行排序 – barrycarter 2010-05-31 19:43:04

1

您可以將數據類型添加到「字段」表中,並存儲字符串或二進制對象,然後將其轉換爲代碼中正確的類型,但您必須在代碼中執行所有驗證。

您還等屬性字段添加諸如可選VS所需的價值,知名度等

1

如果您打算讓用戶輸入任意鍵=>值對,您可能需要查看垂直表。喜歡的東西:

post_id, keyname, keyvalue 
1, 'name', 'teddybear' 
1, 'price', '1.99' 
2, 'colour', 'fuchsia' 
78, 'mother', 'Diana' 
78, 'father', 'Bob' 
78, 'pet', 'Fido' 

每個鍵/值的鏈接的記錄(POST_ID)他們創建的。當你爲用戶提供很多選擇時,這也可以很好地工作,但很少有人會選擇。這個解決方案的缺點包括:a)你不能再利用自動鍵入和b)索引不那麼有用,因爲值類型是混合的。

如果您有一個系統,其中的選項定義得很好,您應該設計您的表以適應這些選項。自動鍵入和索引的優點通常超過了動態改變你的表觀數據結構的靈活性。

-2

你不應該這樣做。
網站用戶與數據庫結構完全無關。

您必須瞭解如何正確設計數據庫結構。
誰在數據庫中使用用戶定義的動態列沒有單個站點。
我相信你可以在沒有它的情況下進行管理。