我需要关于 NoSQL/MongoDb 和数据/模型结构的建议

Posted

技术标签:

【中文标题】我需要关于 NoSQL/MongoDb 和数据/模型结构的建议【英文标题】:I need an advice about NoSQL/MongoDb and data/models structure 【发布时间】:2010-12-21 09:43:56 【问题描述】:

最近我正在探索 NoSQL 数据库。对于给定的问题,我需要关于如何以最优化和最有效的方式存储数据的建议。我现在的目标是 MongoDB。但是它应该与 CouchDB 相同。

假设我们有这 3 个模型:

Story:
 id
 title

User:
 id
 name

Vote:
  id
  story_id
  user_id

我希望能够向数据库提出这些问题:

谁为这个故事投票? 此用户投票支持什么?

我在使用关系数据库时进行简单的连接。问题是,我应该如何存储这些对象的数据才能最有效。

例如,如果我将 Vote 对象存储为 Stories 的子集合,那么获取信息并不容易 - “用户投票支持的内容”。

【问题讨论】:

【参考方案1】:

我建议将投票存储为每个用户的故事列表_ids。这样,您只需查看列表即可找出用户投票支持的故事。要获得为故事投票的用户,您可以执行以下操作:

db.users.find(stories: story_id)

其中story_id 是相关故事的_id。如果您在 stories 字段上创建索引,这两个查询都会很快。

【讨论】:

好吧,事实上我想在投票模型中存储更多信息。例如:created_at、ip、user_agent。我应该将数据存储在用户集合的故事列表中吗? 您可以将投票存储为子文档数组,每个子文档都像story_id: ..., created_at: ..., ip: ... 等。然后查询变为find('stories.story_id': ...)。您也可以对此进行索引。 嗯,我有一个相当大的数据库,有几 M 条记录,将测试上述场景。【参考方案2】: 不要担心您的查询是否有效,直到它开始变得重要 根据下面的报价,你做错了

我一直在做的事情 思维转换就是忘记 数据库一起。在里面 关系数据库世界,你总是必须 担心数据规范化和 你的表结构。抛弃一切。 只需布局您的网页。铺设它们 全力以赴。现在看看他们。您的 已经有2/3了。如果你忘记了 认为数据库大小很重要,并且 数据不应该比你的重复 3/4 在那里,你甚至不必 写任何代码!让你的观点决定 你的模型。你不必采取 你的对象并使它们成为 2 尺寸不再像在 关系世界。你可以存储 现在有形状的对象。

how-to-think-in-data-stores-instead-of-databases

【讨论】:

【参考方案3】:

好的,你已经给出了一个标准化的数据模型,就像你在 SQL 设置中所做的那样。

据我了解,您不会在 MongoDB 中执行此操作。您可以存储引用,但在一般情况下出于性能原因不这样做。

我绝不是 NoSQL 领域的专家,但你为什么不简单地按照你的需求,将投票给故事的用户 (id) 存储在故事集合和故事 (id) 中用户在用户集合中投票了吗?

【讨论】:

【参考方案4】:

在 CouchDB 中,这非常简单。一个视图发出:

function(doc) 
 if(doc.type == "vote") 
   emit(doc.story_id, doc.user_id);
 

另一个视图发出:

function(doc) 
 if(doc.type == "vote") 
   emit(doc.user_id, doc.story_id);
 

由于没有连接,因此两者的查询速度都非常快。如果您确实需要用户数据或故事数据,CouchDB 支持多文档获取。速度也很快,是“加入”的一种方式。

【讨论】:

在这种情况下我需要查询,对吗?一种用于查询 Votes 文档的索引,另一种用于获取 User/Story 的文档。 @Stanislav。那是正确的。您首先需要获取选票,然后为这些选票获取用户和/或故事。【参考方案5】:

我最近一直在研究 MongoDB 和 CouchDB,但我的洞察力有限。尽管如此,在考虑将投票存储在故事文档中时,您可能不得不担心达到 4MB 的文档大小限制。即使您不这样做,您也可能会不断地增加文档的大小以使其移动,从而减慢您的写入速度(请参阅文档在 MongoDB 中的大小)。

对于 CouchDB,一旦计算了视图索引,这些事情就非常简单、优雅且非常快速。然而,就我个人而言,我对在 CouchDB 中做一个类似的项目犹豫不决,因为基准显示它随着数据库的增长(以及视图索引的增长)逐渐减慢到相当大的程度。我希望看到一些最近的基准测试显示随着数据库大小的增加 CouchDB 的性能。我想尝试使用 MongoDB 或 CouchDB,但 SQL 似乎仍然如此高效和合乎逻辑,所以我会一直使用它,直到项目正好适合诱惑。

【讨论】:

以上是关于我需要关于 NoSQL/MongoDb 和数据/模型结构的建议的主要内容,如果未能解决你的问题,请参考以下文章

NoSQL(MongoDB)与Lucene(或Solr)作为您的数据库[关闭]

Linux系统安装NoSQL(MongoDB和Redis)步骤及问题解决办法

NoSQL----MongoDB

缓存EAV数据 - XML还是NoSQL / MongoDB?

NOSQL MongoDB 注入——本质上还是和sql注入是类似的

NoSQL -- Mongodb 安装 使用 副本集 备份恢复