列数变化时的数据库选择

时间:2011-12-28 01:39:33

标签: mysql database nosql

如果我正在考虑存储类似于Facebook上所有人喜欢的电影列表,那么每人的列数不会是恒定的。 我读过一些不赞成NoSQL的文章。 有没有MySQL hack可以让我做这样的事情?

3 个答案:

答案 0 :(得分:1)

正如我在回答这个问题时所说:

insert into two tabels in mysql database at the same time

您要做的是创建一个表来存储一个 - >很多关系。改变列数是不可能的,你要做的是将多行与同一个用户相关联。

答案 1 :(得分:0)

不需要hack,你只需要规划你的架构,以使它成为关系型。

例如,假设您有一个名为Users的表,它具有以下字段:id,name,email,password。它的图形表示如下:

id | name |    email    | password
------------------------------------
1  | John | john@me.com | <md5 hash>
2  | Mark | mark@me.com | <md5 hash>
ETC...

然后,既然您想要存储用户喜欢的电影,您可以拥有另一个名为UsersMovies的表,其中包含字段id,user_id,movie_id:

id | user_id | movie_id
-----------------------
1  | 1       | 187
2  | 1       | 486231
3  | 2       | 9843
4  | 1       | 457
ETC...

第二个表格将包含每个用户与他喜欢的一部电影之间的关系。这意味着,对于user_id 1,你会知道他喜欢带有ids,187,486231和457的电影。这个movie_id可以保存facebook的电影ID,或者无论如何都可以识别这部电影。

采用这种模式,为X用户获取所有电影将是一个简单的:SELECT * FROM UsersMovies WHERE user_id='X',X是用户表中用户的id,而获取喜欢电影X的所有用户将是如此简单作为SELECT user_id FROM UsersMovies WHERE movie_id='X'

您可以从this place了解详情。

答案 2 :(得分:0)

您可以使用传统的关系数据库(如MySQL)来实现。

由于它是 schema-ful 数据库,因此每行不能有不同的列集。但是,您可以使用一列extra(或TEXT)列(我们称之为BLOB)。

您可以获取所有变量列,将它们序列化为JSON(或XML或Protobuf或MessagePack或其他)并写入此特殊列。

这样你就可以将任意数据写入记录并仍然使用MySQL。 但是,您刚刚丢失了大部分RDBMS功能:索引,查询和有效更新该数据。它现在是一个键/值存储并且具有持久性!

此时,使用真正的NoSQL解决方案可能会更好。在更好的中,我可以命名为MongoDB。它是一个无架构数据库(这意味着每一行(或文档,在其术语中)都可以拥有自己唯一的字段集)。 您可以在这些字段上构建二级索引并有效地查询文档。 See the site了解更多功能,演示文稿和视频。

收集尽可能多的信息并做出明智的决定