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


当前回答

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

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

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

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

其他回答

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

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

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

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

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

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

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

只是随便说说,但是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

似乎您主要在犹豫是否要使用关系模型。

就目前的情况而言,您的示例相当适合关系模型,但是当您需要使该模型演进时,问题当然会出现。

如果您的主实体(用户)只有一个(或几个预先确定的)属性级别,您仍然可以在关系数据库中使用实体属性值(entity Attribute Value, EAV)模型。(这也有利弊。)

如果您希望使用应用程序搜索的结构化值较少,那么MySQL可能不是最佳选择。

如果你在使用PostgreSQL,你可能会两全其美。(这真的取决于这里数据的实际结构……MySQL也不一定是错误的选择,NoSQL选项可能是有趣的,我只是建议替代方案。)

事实上,PostgreSQL可以在(不可变的)函数上建立索引(据我所知,MySQL不能),在最近的版本中,你可以直接在JSON数据上使用PLV8来在特定的JSON元素上建立索引,这将提高你搜索数据时的查询速度。

编辑:

因为不会有太多的列需要执行 搜索,使用这两个模型明智吗?数据的每列键 我需要搜索和JSON为其他人(在同一个MySQL数据库)?

混合使用两个模型不一定是错误的(假设额外的空间可以忽略不计),但是如果不能确保两个数据集保持同步,则可能会导致问题:应用程序必须在不更新另一个数据集的情况下更改其中一个。

A good way to achieve this would be to have a trigger perform the automatic update, by running a stored procedure within the database server whenever an update or insert is made. As far as I'm aware, the MySQL stored procedure language probably lack support for any sort of JSON processing. Again PostgreSQL with PLV8 support (and possibly other RDBMS with more flexible stored procedure languages) should be more useful (updating your relational column automatically using a trigger is quite similar to updating an index in the same way).