为了账号安全,请及时绑定邮箱和手机立即绑定

在数据库中存储JSON与为每个密钥添加一个新列

在数据库中存储JSON与为每个密钥添加一个新列

动漫人物 2019-12-10 09:08:40
我正在实现以下用于在表中存储与用户相关的数据的模型-我有2列- uid(主键),该meta列以JSON格式存储有关用户的其他数据。 uid   | meta-------------------------------------------------- 1     | {name:['foo'],        |  emailid:['foo@bar.com','bar@foo.com']}-------------------------------------------------- 2     | {name:['sann'],        |  emailid:['sann@bar.com','sann@foo.com']}--------------------------------------------------这是一个更好的方式(性能明智的,设计明智)比一列,每个属性模型,其中表将不得不像许多列uid,name,emailid。我喜欢第一个模型,您可以添加尽可能多的字段,没有限制。另外,我想知道,既然我已经实现了第一个模型。我该如何对其执行查询,例如,我想获取所有名称如“ foo”的用户?问题 -使用JSON或每字段列数,哪种更好的方式将用户相关数据(请记住字段数是固定的)存储在数据库中?另外,如果实现了第一个模型,如何如上所述查询数据库?我是否应该通过将查询可以搜索的所有数据存储在单独的行中以及将其他数据存储在JSON(是不同的行)中来使用这两种模型?更新资料由于将没有太多列需要执行搜索,因此同时使用两个模型是否明智?我需要搜索的数据的每列关键字和其他人的JSON(在同一MySQL数据库中)?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

像大多数事情一样,“取决于”。将数据存储在列或JSON中本身并没有错,对错,好坏。这取决于您以后需要做什么。您访问该数据的预期方式是什么?您是否需要交叉引用其他数据?


其他人已经很好地回答了技术上的权衡。


没有多少人讨论过您的应用程序和功能会随着时间的推移发展以及这种数据存储决策如何影响您的团队。


因为使用JSON的一种诱惑是避免迁移模式,所以如果团队没有纪律,那么很容易将另一个键/值对粘贴到JSON字段中。没有它的迁移,没有人记得它的用途。没有验证。


我的团队在PostgreSQL的传统列中使用了JSON,一开始这是自切面包以来最好的方法。JSON具有强大的吸引力,直到有一天,我们才意识到灵活性是有代价的,这突然成为一个真正的痛点。有时,这一点会迅速上升,然后变得很难更改,因为我们在此设计决策的基础上建立了许多其他功能。


随着时间的推移,添加新功能以及将数据存储在JSON中导致的查询看起来比如果我们坚持传统列可能添加的查询更为复杂。因此,我们开始将某些关键值返回到列中,以便我们可以进行联接并在值之间进行比较。馊主意。现在我们有了重复。新的开发人员会加入并感到困惑吗?我应该存回哪个值?是JSON还是列?


JSON字段变成了诸如此类的小片段。没有数据库级别的数据验证,文档之间没有一致性或完整性。这将所有责任推到了应用程序中,而不是从传统列中进行困难的类型和约束检查。


回顾过去,JSON使我们能够非常快速地进行迭代并获得成功。太棒了。但是,在我们达到一定的团队规模之后,它的灵活性也使我们陷入了沉重的技术负担之中,从而减慢了后续功能开发的进度。请谨慎使用。


认真思考一下数据的本质。这是您应用程序的基础。随着时间的推移将如何使用数据。并有可能改变吗?



查看完整回答
反对 回复 2019-12-11
?
慕的地10843

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




查看完整回答
反对 回复 2019-12-11
  • 3 回答
  • 0 关注
  • 391 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信