[英]RDBMS - Best way to store several key value related to one record
我正在一個網站上工作,該網站就像一個市場,注冊賣家可以出售其他種類的商品。 對於每個項目,都有公共屬性和可選屬性。 看下面的內容,我會盡力解釋。
實際上,我們有一個名為items的表,其中包含所有待售商品,還有一個名為item_attr的表,其中包含常見商品屬性。 因此,一項可能與0、1或多個可選屬性相關。
我們正在研究兩種方法來存儲每個項目的可選值,但這兩種方法都可能帶來問題。
創建一個名為item_additional_attr的新表,其中每個記錄將代表單個項的附加屬性。 item和item_additional_attr之間將存在一對多關系 。 這似乎是最“數據庫友好”的解決方案,但我擔心此表的大小可能會如此。 如果項目包含100.000條記錄,並且每個項目平均與5個可選屬性相關,則item_additional_attr將包含500.000條記錄。 當然,那將是一個巨大的表。
在item_attr中創建一個名為optional_attributes的新字段類型
TEXT
或BLOB
。 該字段將包含可選屬性數組,並將在PHP中進行處理。 當然,該數組將以序列化或json編碼的形式存儲。 我認為這種方法可能會給某些查詢帶來問題,但可以在PHP中毫無問題地進行處理。
我優先考慮webserver / db的性能,但同時也避免了查詢問題。 此外,附加屬性將僅用於顯示表格中的技術規格,而不會用於過濾/排序。 那么,您認為實現此目標的最佳方法是什么?
您可能想嘗試使用EAV(實體屬性值)表。 基本上,您將維護幾個表。 一個表應存儲項目列表。 其他表應保留所有具有相似數據類型的屬性。 我創建了一個簡單的架構來演示:
+---------+------------+
| item_id | item_name |
+---------+------------+
| 1 | Cell Phone |
| 2 | Shirt |
+---------+------------+
2 rows in set (0.00 sec)
+---------+--------------+----------------+-----------------+
| item_id | attribute_id | attribute_name | attribute_value |
+---------+--------------+----------------+-----------------+
| 1 | 2 | storage | 8GB |
| 1 | 3 | color | Gray |
| 2 | 4 | size | XL |
| 2 | 6 | shirt_color | Red |
+---------+--------------+----------------+-----------------+
4 rows in set (0.00 sec)
+---------+--------------+----------------+-----------------+
| item_id | attribute_id | attribute_name | attribute_value |
+---------+--------------+----------------+-----------------+
| 1 | 2 | price | 49 |
+---------+--------------+----------------+-----------------+
1 row in set (0.00 sec)
第一個表是項目列表。 第二張表是varchar類型的項目屬性的列表。 第三張表列出了int類型的項目的屬性。 這將允許可伸縮的數據庫將屬性分散到多個表。 唯一的缺點是您需要獲得一個項目及其所有屬性的聯接量。 可以通過php使用文本緩存方案,以存儲項目信息以提高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.