2010-06-18 19 views
3

我想將條目(一組鍵=>值對)存儲在數據庫中,但鍵的條目因條目而異。模擬sqlite中的變量列名

我想存儲兩個表,(1)每個條目的鍵和(2)每個條目的特定鍵的值,其中條目共享兩個表中的公共ID字段,但我不是確定如何使用這種配置將sql條目作爲關鍵字=>值對進行配對。

有沒有更好的方法?如果這在sqlite中不可行,是否可以在mysql中使用?謝謝!

回答

4

這聽起來像你正在尋找Entity-Attribute-Value model

替代方法是爲不同類型的實體創建不同的表,或者爲每個可能的鍵創建一個具有列的表,併爲沒有該鍵的實體設置值爲NULL。

您可能想看看Bill Karwin的演示文稿SQL Antipatterns,他介紹了EAV模型的一些優缺點,並提出了可能的替代方案。相關部分從幻燈片16開始。

1

@Mark Byers是對的,這是EAV模型。在你走下那條黑暗的道路之前,你應該閱讀Bad CaRMa。這是一個關於這個數據庫設計如何實際上摧毀了一家公司的故事。

在關係數據庫中,關係中的每一行都必須包含相同的列。這是關係定義的一部分。這在SQLite,MySQL或任何其他關係數據庫中都是如此。

另請參閱我的演示文稿Practical Object-Oriented Models in SQL或我的書SQL Antipatterns,其中我展示了由EAV模型引起的問題。

如果您需要每個實體的變量列,則需要非關係數據庫。面向文檔的數據庫如CouchDBMongoDB正在流行。

或者嘗試Berkeley DB如果你想要一個像SQLite這樣的嵌入式單用戶解決方案。