我一直在关注 NoSql 运动的兴起以及随之而来的文档数据库(如 mongodb、ravendb 等)的普及。虽然有很多我喜欢的东西,但我觉得我不理解一些重要的东西。
假设您正在实现一个商店应用程序,并且您想在数据库中存储产品,所有这些产品都有一个唯一的类别。在关系数据库中,这将通过有两个表来完成,一个产品表和一个类别表,并且产品表将具有一个字段(可能称为“category_id”),该字段将引用类别表中包含正确类别条目的行。这有几个好处,包括不重复数据。
这也意味着,如果您拼错了类别名称,例如,您可以更新类别表,然后将其修复,因为这是值存在的唯一位置。
然而,在文档数据库中,这不是它的工作方式。您完全非规范化,这意味着在“产品”文档中,您实际上将拥有一个包含实际类别字符串的值,导致大量重复数据,并且错误更难以纠正。多想一下,这是否也意味着运行诸如“给我该类别的所有产品”之类的查询会导致结果不完整。
当然,解决这个问题的方法是在文档数据库中重新实现整个“category_id”,但是当我想到这一点时,我意识到我应该只使用关系数据库而不是重新实现它们。
这让我相信我错过了一些关于文档数据库的关键点,导致我走上了这条错误的道路。所以我想把它放到堆栈溢出中,我错过了什么?