簡體   English   中英

mysql 表中的動態列?

[英]Dynamic columns in mysql tables?

我想在 mysql 表中添加動態列,但我不知道具體如何。

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

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

我以為我可以創建一個多對多表:

線程 <-> thread_field <-> 字段

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

這是一個好的結構嗎?

但是通過這種方式我必須設置一個特定的列類型 thread_field.value。 它是一個整數或一個字符串。 我希望有可能讓它動態,讓用戶選擇。

我怎樣才能做到這一點?

謝謝!

丑陋的方式:

thread_field:field_id,thread_id,value_text,value_int

其中value_text聲明為TEXT,value_int聲明為INT。

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

關於關系數據庫,這個問題經常出現。 它是關系定義的一部分,它具有一組固定的屬性,而不是動態屬性。

如果需要在關系數據庫中允許用戶定義屬性,則最簡單的解決方案是存儲序列化BLOB,例如XML或其他半結構格式(JSON,YAML)。 您將失去使用SQL進行有效查詢的能力(除非您使用通過XML函數和索引擴展SQL的RDBMS),但是無論您如何解決此問題,都將犧牲RDBMS的許多功能。

另一種選擇是使用新的非關系數據存儲庫之一,例如CouchDBMongoDB ,這使擴展具有動態結構屬性的實體變得容易,同時又保持了一定的效率。

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

您還可以將其他屬性添加到該字段,例如Optional vs Required值,可見性等。

如果您打算讓用戶輸入任意鍵=>值對,則可能需要查看垂直表。 就像是:

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)索引不那么有用,因為值類型混合在一起。

如果您的系統中選項定義明確,則應設計表格以適合這些選項。 自動鍵入和建立索引的優點通常勝過即時更改表觀數據結構的靈活性。

最后是MySQL select where JSON field property has value 將您的數據保存在 json 列中,讓 mysql 發揮作用

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

您必須學習如何正確設計數據庫結構。
誰在數據庫中使用用戶定義的動態列,周圍沒有一個站點。
而且我敢肯定,如果沒有它,您可以進行管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM