簡體   English   中英

RDBMS-存儲與一條記錄相關的多個鍵值的最佳方法

[英]RDBMS - Best way to store several key value related to one record

我正在一個網站上工作,該網站就像一個市場,注冊賣家可以出售其他種類的商品。 對於每個項目,都有公共屬性和可選屬性。 看下面的內容,我會盡力解釋。

腳本

  1. 賣方添加新商品(例如, iPhone 6 16 GB黑色
  2. 他構建指定項目屬性的插入(例如, 價格運輸價格條件圖像描述等)。 對於任何項目,這種屬性都是必需的和通用的。
  3. 填寫完所有必需的屬性后,賣方便可以指定僅與該商品相關的其他類型的屬性(例如, RAM容量大小重量型號年份OS核心數等)。 這種屬性是可選的。 賣方指定密鑰(例如容量 )和值(例如16 gb ),並且它們僅與該單個項目相關。 另一位賣家出售的另一款iPhone 6 16 GB黑色可能具有不同的屬性。

實際上,我們有一個名為items的表,其中包含所有待售商品,還有一個名為item_attr的表,其中包含常見商品屬性。 因此,一項可能與0、1或多個可選屬性相關。

我們正在研究兩種方法來存儲每個項目的可選值,但這兩種方法都可能帶來問題。

案例A

創建一個名為item_additional_attr的新表,其中每個記錄將代表單個項的附加屬性。 itemitem_additional_attr之間將存在一對多關系 這似乎是最“數據庫友好”的解決方案,但我擔心此表的大小可能會如此。 如果項目包含100.000條記錄,並且每個項目平均與5個可選屬性相關,則item_additional_attr將包含500.000條記錄。 當然,那將是一個巨大的表。

情況B

item_attr中創建一個名為optional_attributes的新字段類型TEXTBLOB 該字段將包含可選屬性數組,並將在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.

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