我正在实现以下模型存储用户相关的数据在我的表-我有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数据库)?


当前回答

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

其他回答

正如其他人指出的那样,查询将会变慢。我建议至少添加一个'_ID'列来查询。

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

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

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

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

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

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

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

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