3 回答
TA贡献1821条经验 获得超4个赞
像大多数事情一样,“取决于”。将数据存储在列或JSON中本身并没有错,对错,好坏。这取决于您以后需要做什么。您访问该数据的预期方式是什么?您是否需要交叉引用其他数据?
其他人已经很好地回答了技术上的权衡。
没有多少人讨论过您的应用程序和功能会随着时间的推移发展以及这种数据存储决策如何影响您的团队。
因为使用JSON的一种诱惑是避免迁移模式,所以如果团队没有纪律,那么很容易将另一个键/值对粘贴到JSON字段中。没有它的迁移,没有人记得它的用途。没有验证。
我的团队在PostgreSQL的传统列中使用了JSON,一开始这是自切面包以来最好的方法。JSON具有强大的吸引力,直到有一天,我们才意识到灵活性是有代价的,这突然成为一个真正的痛点。有时,这一点会迅速上升,然后变得很难更改,因为我们在此设计决策的基础上建立了许多其他功能。
随着时间的推移,添加新功能以及将数据存储在JSON中导致的查询看起来比如果我们坚持传统列可能添加的查询更为复杂。因此,我们开始将某些关键值返回到列中,以便我们可以进行联接并在值之间进行比较。馊主意。现在我们有了重复。新的开发人员会加入并感到困惑吗?我应该存回哪个值?是JSON还是列?
JSON字段变成了诸如此类的小片段。没有数据库级别的数据验证,文档之间没有一致性或完整性。这将所有责任推到了应用程序中,而不是从传统列中进行困难的类型和约束检查。
回顾过去,JSON使我们能够非常快速地进行迭代并获得成功。太棒了。但是,在我们达到一定的团队规模之后,它的灵活性也使我们陷入了沉重的技术负担之中,从而减慢了后续功能开发的进度。请谨慎使用。
认真思考一下数据的本质。这是您应用程序的基础。随着时间的推移将如何使用数据。并有可能改变吗?
TA贡献1785条经验 获得超8个赞
只是把它扔在那里,但是WordPress具有这种东西的结构(至少WordPress是我观察到的第一个地方,它可能起源于其他地方)。
它允许无限制的键,并且比使用JSON blob更快地进行搜索,但不如某些NoSQL解决方案快。
uid | meta_key | meta_val
----------------------------------
1 name Frank
1 age 12
2 name Jeremiah
3 fav_food pizza
.................
编辑
用于存储历史记录/多个键
uid | meta_id | meta_key | meta_val
----------------------------------------------------
1 1 name Frank
1 2 name John
1 3 age 12
2 4 name Jeremiah
3 5 fav_food pizza
.................
并通过类似这样的查询:
select meta_val from `table` where meta_key = 'name' and uid = 1 order by meta_id desc
添加回答
举报