[英]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.