我正在实现以下模型存储用户相关的数据在我的表-我有2列- uid(主键)和一个元列,其中存储关于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数据库)?


当前回答

只是随便说说,但是WordPress有一个关于这类东西的结构(至少WordPress是我第一个观察到它的地方,它可能起源于其他地方)。

它允许无限的键,并且比使用JSON blob搜索更快,但不如一些NoSQL解决方案快。

uid   |   meta_key    |   meta_val
----------------------------------
1         name            Frank
1         age             12
2         name            Jeremiah
3         fav_food        pizza
.................

EDIT

用于存储历史记录/多个键

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

其他回答

和大多数事情一样,“视情况而定”。将数据存储在列或JSON中本身没有对错/好坏之分。这取决于你以后要用它做什么。您预计使用什么方式访问这些数据?您是否需要交叉引用其他数据?

其他人已经很好地回答了技术权衡是什么。

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

因为使用JSON的诱惑之一是避免迁移模式,所以如果团队没有纪律,很容易在JSON字段中插入另一个键/值对。它不需要迁移,没有人记得它是干什么用的。它没有验证。

我的团队在postgres中使用JSON和传统列一起使用,起初这是自切片面包以来最好的东西。JSON是有吸引力和强大的,直到有一天我们意识到灵活性是有代价的,它突然成为一个真正的痛点。有时,这个点很快就会上升,然后就很难改变了,因为我们已经在这个设计决策的基础上构建了太多其他东西。

随着时间的推移,添加新功能,使用JSON格式的数据会导致看起来比使用传统列所添加的查询更复杂。然后我们开始把某些键值捞出来放到列中,这样我们就可以在值之间进行连接和比较。坏主意。现在我们有了复制。一个新的开发人员会感到困惑吗?我应该存回哪个值呢?JSON还是列?

JSON字段变成了存放这个和那个小碎片的垃圾抽屉。没有数据库级别的数据验证,文档之间没有一致性或完整性。这将所有的责任推到应用程序中,而不是从传统的列中获得严格的类型和约束检查。

回顾过去,JSON让我们能够快速迭代并创造出一些内容。太棒了。然而,当我们达到一定的团队规模后,它的灵活性也让我们陷入了技术债务的长绳中,从而减缓了随后的功能开发进程。请谨慎使用。

仔细思考你的数据的性质是什么。这是你的应用程序的基础。随着时间的推移,数据将如何使用。它可能会发生怎样的变化?

如果你试图将一个非关系模型纳入关系数据库,我认为你会更好地使用NoSQL数据库,如MongoDB。没有预定义的模式可以满足您对字段数量没有限制的要求(请参阅典型的MongoDB集合示例)。查看MongoDB文档以了解如何查询文档,例如:

db.mycollection.find(
    {
      name: 'sann'
    }
)

基本上,您使用的第一个模型称为基于文档的存储。你应该看看流行的基于NoSQL文档的数据库,比如MongoDB和CouchDB。基本上,在基于文档的db中,你将数据存储在json文件中,然后你可以对这些json文件进行查询。

第二种模型是流行的关系数据库结构。

如果你想使用像MySql这样的关系数据库,那么我建议你只使用第二种模型。在第一个模型中使用MySql和存储数据是没有意义的。

为了回答你的第二个问题,如果你使用第一个模型,就没有办法查询像'foo'这样的名称。

简短的回答 你必须混合它们, 使用json的数据,你不打算与他们建立关系,如联系数据,地址,产品变量

有时表上的连接将是一种开销。比方说OLAP。如果我有两个表,一个是ORDERS表,另一个是ORDER_DETAILS。为了获得所有的订单细节,我们必须连接两个表,这将使查询变慢,当表中没有一行增加,比如数百万左右。左/右连接比内连接太慢。 我认为如果我们在各自的ORDERS条目中添加JSON字符串/对象,JOIN将被避免。添加报告生成将更快…