关于NoSQL(M:N关系)我不懂的东西

时间:2012-08-26 13:37:27

标签: mongodb many-to-many nosql

我承认......在NoSQL世界中,我缺乏很多理论概念。

我在考虑使用Java + MySQL将一些简单的应用程序移植到NodeJS + MongoDB(我找到了看起来非常酷的mongoose ORM)。

我发现的第一件事情,其中​​很难找到并且记录较少的内容是映射多对多关系。

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

...然后潜伏在一些现实世界的信息中,我发现很多q& a喜欢:Modeling data on a many-to-many join in Mongo?

有实现M:N的方法,很酷!但后来我读到了令我非常害怕和失望的东西:“老实说,如果你发现自己需要加入,我会选择关系数据库。

OK!我明白了这一点但是......想象一下,我有常见的User + Roles + UserRoles多对多架构,我使用嵌入,我的意思是,我没有使用另一个表格架构来表示角色,我只使用其中包含所有角色数据的用户

我需要:

  • 查询数据库中的所有用户,同时阅读他们的角色数据;
  • 查询db中可用的所有角色,例如,选择与用户创建相关联的角色;

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

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

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

2 个答案:

答案 0 :(得分:2)

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

正确执行此操作的方法是查看您的用例并相应地设计数据库
这意味着您将不得不考虑使用方案。

用户/角色示例

让我们考虑用例。

  • 快速告知
  • 中的用户角色
  • 查询所有角色,以便在创建或编辑用户时为用户选择角色。

我会这样做:

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

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

答案 1 :(得分:1)

您的选择是:

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

做出选择......