4

我承认……谈到 NoSQL 世界,我缺乏很多理论概念。

我正在考虑将一些使用 Java+MySQL 的简单应用程序移植到 NodeJS+MongoDB(我发现 mongoose ORM 看起来真的很酷)。

我发现真正困难且记录较少的第一件事是映射多对多关系。

我首先阅读了 Mongo-DOCS:http ://www.mongodb.org/display/DOCS/Schema+Design

...然后潜伏在一些真实世界的信息中,我发现了很多这样的问答:在 Mongo 中对多对多连接建模数据?

有办法实现 M:N,太酷了!但后来我读到一些让我感到害怕和失望的东西:“老实说,如果你发现自己需要连接,我会选择关系数据库。

好的!我明白了,但是....想象我有常见的 User + Roles + UserRoles 多对多模式,我使用embedding,我的意思是,我不使用另一个表模式作为角色,我只使用 User 和 all其中的角色数据

我需要:

  • 查询数据库中的所有用户,也读取他们的角色数据;
  • 查询数据库中刚刚可用的所有角色,例如,用于选择在用户创建中关联的角色;

第一点是微不足道的,但第二点呢?

您会告诉我,我需要另一个表模式“角色”并将角色数组存储在“用户”中,其中包含角色的 ID,但是您会告诉我这是一个关系世界!

你是在告诉我它不适合 NoSQL 数据库吗?那么会是什么呢?

4

2 回答 2

3

您可能需要对数据进行非规范化。

正确的方法是查看您的用例并相应地设计您的数据库
这意味着您将不得不考虑使用场景。

用户/角色示例

让我们考虑一下用例。

  • 快速判断用户属于什么角色
  • 查询所有角色,以便在创建或编辑用户时为用户选择角色。

我会这样做:

  • 像现在一样将角色存储在用户上
  • 还将所有角色存储在单独的集合中

这将正确满足所有要求。
显然,由于非规范化,您在更新/重命名角色时需要特别小心。

于 2012-09-27T11:28:55.293 回答
0

您的选择是:

  • 非规范化您的数据
  • 执行多个查询
  • 使用 MongoDB 聚合框架(如果在此处适用)
  • 不要使用 MongoDB

做出你的选择...

于 2012-08-26T13:51:28.160 回答