在数据库中具有JSON列时存储PK ID或名称吗?

时间:2018-10-23 20:28:50

标签: json sql-server

我有一个表,其中有一个JSON列,其中包含产品的所有非常见规格。

例如我可能有

手机,我将屏幕尺寸存储在此json列中,因为我可能有另一种根本没有屏幕的产品(电脑机箱)。

{screenSize: "6 inches" }

但是有些产品我有一个预定义的选项列表,因此在上面的示例中,我的数据库中可能会有另一个表

ScreenSizesTbl(在我的实际数据库中,它更通用,可以容纳所有产品的所有预定义选项)

id  Name
1   6 inches
2   5 inches

我应该存储名称或ID吗?

{screenSize: "6 inches" } or     {screenSize: 1 }

如果我选择后者,那么在提取此信息时,我会即时获得名称。我看到的好处是,如果我将名称更改为“ 6英寸”,则无需进行数据修复。

我看到的缺点是,如果我正在查看原始数据,那么我只会看到所有id,并且不确定是否真的可以将json属性联接到表上的id。

我正在使用sql server 2017,因此它具有json支持,但是我不确定是否支持加入我需要的东西。

1 个答案:

答案 0 :(得分:0)

  

我看到的缺点是,如果我正在查看原始数据,我只会看到所有   id,不确定我是否真的可以对json属性进行联接   桌子上的ID。

这是一个良好的标准化数据库的标志。您的表应该有很多与其他表连接的ID,然后原始值仅存储在单个表中的某个位置。我每天都会编写大量查询,这些查询需要3次以上的联接才能从主表进入为我提供原始字符串值的查找表。

您应该做的一个例子是:

您有一个包含产品名称,createddatetime等的产品表(product_id为PK)和一个包含“屏幕尺寸”,“芯数”等内容的属性表(attribute_id为PK),但没有值,那么您就有一个将这些值匹配在一起并分配数字/字符串值的表。

所以您的表最终是:

Product_ID    Attribute_ID    Value 
1             1               6in 
1             2               2600Hz 
1             3               Pepperoni 
1             4               Blue

并且您必须加入产品以获得产品名称,并加入属性以获取属性名称。我已经看到了值表,其中每个值都有一个ID,您也必须加入该ID。

在绝对的情况下,您需要存储JSON,但是解析出用于连接和利用索引以进行快速检索的值可能会很痛苦。