Mysql
對於包含不同實體類別的各種類型的不同屬性的邏輯結構的最佳設計是什麼?(MySQL 或 NoSQL)
我正在設計一個需要包含產品列表的 MySQL 數據庫。這些產品,根據它們的類別,需要有一個各種屬性的列表。
假設“顯示器”類別中的所有產品都需要具有屬性“名稱”(varchar)和“描述”(文本),而“鍵盤”類別中的產品需要具有屬性“線長”(浮點數)和“鍵盤突出顯示”(布爾值)。
我想出了以下結構:
表產品:
- id_product INT$$ PK $$
- 類別 ENUM(‘顯示器’,‘鍵盤’, …)
表屬性:
- id_property INT$$ PK $$
- 名稱 VARCHAR(50)
表值:
- id_value 整數$$ PK $$
- id_product INT$$ FK $$
- id_property INT$$ FK $$
- 鍵入 ENUM(‘varchar’,‘boolean’, …)
表值_varchar
- id_value INT [ FK ]
- 值 VARCHAR(255)
表value_boolean
- id_value INT [ FK ]
- 布爾值
如您所見,該結構包含兩個基本表product和category以及**value表中的多對多關係,但它不保留 value 表中的屬性值(因為它們可以是不同的類型)。相反,這些值保存在額外的特定類型表value_varchar、value_boolean等(應該有更多這樣的表,如value_text等)。
這種結構對我來說似乎不是最理想的,就好像我想檢索特定產品的所有值一樣,我需要首先檢索值類型,然後執行其他查詢以從與這些類型相關的表中檢索值。但是,就 MySQL 而言,我現在想不出更好的辦法。也許 NoSQL 是對這種結構的回答?如果是這樣,我應該研究哪一個 NoSQL 引擎?我沒有使用 NoSQL 的經驗。
提前感謝您幫助我。
我建議您閱讀@Bill Karwin在此展示文稿中有關實體-屬性-值模式的危險。
如果您不需要讀取和寫入單個屬性,則其中一種解決方案是將類似 NoSQL 的數據儲存在序列化的 BLOB 中。也就是說,將一個鍵(產品)儲存為主鍵,並將變數屬性值對一起儲存在一個 blob 中。這是一個非規範化的結構,將約束的責任留給了應用層,但它適用於某些模式(通常適用於 NoSQL 解決方案)。即使需要索引,也可以根據需要在單獨的表上創建反向索引。
這個和其他解決方案可以在最新的 MySQL 會議的這個展示文稿中看到,包括您何時應該搜尋替代數據庫引擎。