MongoDB正常化,外键和join

在深入研究MongoDB几天之前,我想我会提出一个非常基本的问题,就是我是否应该深入研究它。 我基本上没有使用nosql的经验。

我读了一些关于文档数据库的一些好处,我认为对于这个新的应用程序,它们将会非常棒。 对于许多types的对象(大量m-to-m关系)和子类做collections夹,评论等是一件很麻烦的事情,这是很痛苦的。

我也有一个在SQL中定义的结构,因为它是非常嵌套的,并且转换为比15个不同表更好的文档。

但是我对一些事情感到困惑。

  1. 是否需要保持数据库正常化? 我真的不想更新多个logging。 这仍然是人们如何处理MongoDB中的数据库devise?

  2. 当一个用户collections一本书,并且这个select仍然存储在一个用户文档中,但是这本书被删除了,会发生什么? 如何在没有外键的情况下解除关系? 我手动负责删除自己的所有链接?

  3. 如果用户喜欢一本不再存在的书,我会查询它(某种连接)会发生什么? 我必须在这里做任何容错吗?

MongoDB不支持服务器端的外键关系,标准化也不鼓励。 如果可能的话,你应该把你的子对象embedded到父对象中,这样会提高性能并且使得外键是完全不必要的。 这就是说它并不总是可能的,所以有一个叫DBRef的特殊构造,它允许引用不同集合中的对象。 这可能不那么快,因为数据库必须做额外的查询来读取对象,但允许一种外键引用。

你仍然需要手动处理你的参考。 只有在查找DBRef的时候,你会看到它是否存在,如果引用的目标不再存在,数据库将不会遍历所有的文档来查找引用并删除它们。 但是我认为在删除这本书之后删除所有的参考文献将需要每个集合的一个查询,没有更多,所以不是那么难。

如果你的模式更复杂,那么你可能应该select一个关系数据库而不是nosql。

还有一本关于deviseMongoDB数据库的书:MongoDB的文档devise

更新上面的书不再可用了,但是由于MongoDB的stream行,还有很多其他的东西。 我不会把它们全部链接起来,因为这样的链接很可能会改变,亚马逊的一个简单search会显示多个页面,所以find一些不应该是一个问题。

有关更多详细信息和示例,请参阅MongoDB手册页的“手册参考”和DBRef

以上,@TomaaszStanczak说

MongoDB不支持服务器端的外键关系,标准化也不鼓励。 如果可能的话,你应该把你的子对象embedded到父对象中,这样可以提高性能,并且完全不需要外键。 这说,这并不总是可能的…

Mongo不会阻止规范化。 要清楚的是,我们正在谈论两个数据实体可能具有的两种根本不同types的关系。 其中之一是一个子实体由一个父对象独占。 在这种types的关系蒙古方式是embedded。

在另一类关系中,两个实体独立存在 – 具有独立的生命时间和关系。 Mongo希望这种types的关系不存在,并且对于如何处理这种关系感到沮丧。 embedded不是一个解决scheme。 正常化不是不鼓励或鼓励的。 Mongo只是给你两个机制来处理它。 手动引用 (类似于具有绑定两个表的外键约束的键)和DBRef (一种不同的,稍微更加结构化的方法)。 在这个用例中SQL数据库赢了。