这个问题一直让我发疯,我无法理解它。我来自MySQL关系背景,一直在使用Meteorjs和Mongo。出于本问题的目的,以帖子和作者为例。许多帖子的一位作者。我想出了两种方法:
只有一个帖子集合 - 每个帖子都有作者信息嵌入到文档中。这当然会导致非规范化和问题,例如作者姓名是否会改变如何保持数据的正确性。
有两个集合:帖子和作者 - 每个帖子都有一个引用作者集合的作者ID。然后我尝试做一个"加入"在尝试维持反应性时,在非关系数据库上。
在我看来MongoDB的非规范化程度是可以接受的,我很想嵌入,因为实现连接确实感觉违背了Mongo的理想。
任何人都可以了解什么是正确的方法,特别是在希望我的应用数据能够很好地扩展和易于管理方面?
由于
答案 0 :(得分:3)
当您扩展应用程序并且发现某些查询花费了太多时间来完成时,非规范化非常有用。我还注意到大多数Mongodb开发人员往往忘记了数据规范化,但这是另一个话题。
一些开发人员说:“不要使用observe和observeChanges,因为它很慢”。我们正在构建实时应用程序,以便正常发生,这是一个CPU密集型应用程序设计。
在我看来,你应该始终瞄准规范化的数据库设计,然后你必须决定,尝试和测试哪些字段,重复/非规范化,可以提高你的应用程序的性能。示例:每个用户删除1个查询。用户界面需要一个额外的字段,并且可以快速复制它等等。
通过非规范化,您需要付出额外的代价。您必须根据主要集合更新非规范化字段。
实施例: 让我们说你的作者和文章集合。在每篇文章中,您都有作者姓名。作者可能会改变他的名字。使用规范化方案,它可以正常工作。使用非规范化方案,您必须使用新名称更新作者文档名称和此作者拥有的每篇文章。
保持标准化设计会让您的生活更轻松,但最终还是必须进行非正规化。
从MeteorJs的角度来看:使用规范化方案,您将数据从2个集合发送到客户端。使用非规范化方案,您只发送1个集合。您也可以在服务器上反应性地加入并向客户端发送1个集合,尽管它会因服务器上的MergeBox而增加RAM使用率。
非规范化是它为您的应用程序需求指定的东西。您可以使用Kadira找到提高应用程序速度的方法。在尝试提高性能时,数据库设计只是其中的一个因素。