存储非标准数据的最佳方式

时间:2015-07-06 20:15:38

标签: php mysql database schema

背景

我必须存储有关一组产品的信息。这些信息将通过PHP提取到一个网站上,可能与WordPress一起使用,可能使用原始PHP。问题是这些产品具有不一致的属性。例如:

产品A

  • 宽度=> 6"
  • 高度=> 5"
  • 重量=> 2磅
  • 颜色=>黑

产品B

  • 重量=> 3磅
  • 制造商=>微软
  • 日期=> 2015年2月1日

简单的答案是SQL中的单个表,列数不断增加,其中大部分为空,以涵盖所有可能的属性。考虑到可能的属性数量和可扩展性的需要,我不认为这是可行的方法。

想法1

我想到的是设置一个表,每行都是一个产品,并且有一个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的行数很多。

创意2

嵌套数组,以某种方式存储

表格

Product | Attributes | ID
Phone   | ARRAY      | 0001
Table   | ARRAY      | 0002

我的ARRAY是一组键值对。序列化可能,并存储?我可以想到一组无限制的键值对。

我的问题

实现存储此类数据的最佳方式是什么?有最佳做法吗?完全有不同类型的数据库吗?我听说过JSON这个词,它在这里有用吗?

5 个答案:

答案 0 :(得分:0)

JSON是您正在寻找的,但前提是您不希望通过这些“额外”属性之一来搜索或排序数据库。用法非常简单,有内置的json_encodejson_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模式使得强制完整性或查询变得困难,并且随着属性的数量变得更糟。在你购买之前做一些研究。