我必须存储有关一组产品的信息。这些信息将通过PHP提取到一个网站上,可能与WordPress一起使用,可能使用原始PHP。问题是这些产品具有不一致的属性。例如:
产品A
产品B
简单的答案是SQL中的单个表,列数不断增加,其中大部分为空,以涵盖所有可能的属性。考虑到可能的属性数量和可扩展性的需要,我不认为这是可行的方法。
我想到的是设置一个表,每行都是一个产品,并且有一个ID。第二个表将使每一行都是一个属性,由产品ID链接。
表1
Product | ID
Phone | 0001
Table | 0002
表2
Product ID | ID | Attribute Label | Attribute Value
0001 | 0001 | Height | 2"
0001 | 0002 | Width | 3"
0001 | 0003 | Weight | 2lb
0002 | 0004 | Company | Apple
0002 | 0005 | Color | Black
0002 | 0006 | Weight | 2lb
我看到的问题是表2的行数很多。
嵌套数组,以某种方式存储
表格
Product | Attributes | ID
Phone | ARRAY | 0001
Table | ARRAY | 0002
我的ARRAY
是一组键值对。序列化可能,并存储?我可以想到一组无限制的键值对。
实现存储此类数据的最佳方式是什么?有最佳做法吗?完全有不同类型的数据库吗?我听说过JSON这个词,它在这里有用吗?
答案 0 :(得分:0)
JSON是您正在寻找的,但前提是您不希望通过这些“额外”属性之一来搜索或排序数据库。用法非常简单,有内置的json_encode和json_decode PHP函数。 json_encode将结构数据(例如您的参数数组)转换为字符串表示形式,然后可以将其保存在MySQL的TEXT列中。如果您使用的是postgres,那么还有JSON和JSONB类型。 json decode完全相反,将文本转换回参数数组。
JSON 序列化绝对可以为您的方案提供最高性能。
如果需要按这些属性进行搜索或排序,那么属性表可能更适合您的需求。
答案 1 :(得分:0)
如果不需要系统地查询/搜索数据,可以使用JSON json_encode()或PHP serialize()来存储数据。
如果你做需要系统地查询/搜索数据,我个人更喜欢存储在数据库中的非标准的键/值对。我建议使用两张桌子。例如:
TABLE PRODUCTS:
ID | ProductName | Category | Price | ...
------+----------------+----------+--------+----
12345 | Toothbrush | Misc. | 2.99 | ...
12115 | MS Windows DVD | Software | 99.00 | ...
76354 | AMD FX-8350 | CPUs | 189.00 | ...
TABLE PRODUCTSPECS:
ID | ProductID | KeyName | Value
-----+-----------+-----------+-------
0001 | 12345 | Width | 6"
0001 | 12345 | Height | 8"
0002 | 12115 | Depth | 6"
0003 | 12115 | Mfg. | Microsoft
0004 | 76354 | Socket | AM3+
你可以进一步使用两个“Key”列,一个用于简短形式,一个用于描述性形式,但这实际上取决于你的应用程序。
每行的ID都是唯一的,最好设置为auto_increment。 ProductID应使用约束,引用product表的ID。
答案 2 :(得分:0)
也许你会更开心"使用基于文档的数据库,例如MongoDB。
这与提出的JSON解决方案没有什么不同;例如文件说
MongoDB中的文档结构是BSON对象,支持所有BSON类型;但是,BSON文档在概念上类似于JSON对象,并具有以下结构:
但您不会失去直接在数据库中搜索文档的能力 具有某些特性。
答案 3 :(得分:0)
您正在考虑的模型类型称为Entity-Attribute-Value Model,这对您所描述的情况来说相当常见。我不会在这里使用JSON,它只是在存储或检索数据时增加了一层复杂性。
答案 4 :(得分:0)
为产品的常见属性创建表格:
products (product_id PK, product_name)
相关可选属性集的表格:
weights (product_id PK/FK, weight)
sizes (product_id PK/FK, width, height)
colors (product_id PK/FK, color)
manufactured (product_id PK/FK, company_id FK, date)
EAV模式使得强制完整性或查询变得困难,并且随着属性的数量变得更糟。在你购买之前做一些研究。