Meteor.js - 你应该对数据进行反规范化吗?

Meteor.js - Should you denormalize data?

这个问题一直让我发疯,我无法理解它。我来自 MySQL 关系背景并且一直在使用 Meteorjs 和 Mongo。出于此问题的目的,以 post 和作者为例。许多帖子的一位作者。我想出了两种方法来做到这一点:

  1. 有一个 post 集合 - 每个 post 都将作者信息嵌入到文档中。这当然会导致非规范化和问题,例如作者姓名更改如何保持数据正确。

  2. 有两个集合:posts 和作者 - 每个 post 都有一个引用作者集合的作者 ID。然后,我尝试在非关系数据库上执行 "join",同时尝试保持反应性。

在我看来 MongoDB 的非规范化程度是可以接受的,我很想嵌入,因为实现连接确实感觉违背了 Mongo 的理想。

任何人都可以阐明什么是正确的方法,尤其是在希望我的应用程序数据能够很好地扩展和易于管理方面?

谢谢

当您扩展应用程序并且您注意到某些查询花费太多时间才能完成时,非规范化很有用。我还注意到大多数 Mongodb 开发人员往往会忘记数据规范化,但这是另一个话题。

有些开发人员会这样说:"Don't use observe and observeChanges because it's slow"。我们正在构建实时应用程序,以便正常的事情发生,这是一个 CPU 密集型应用程序设计。

在我看来,您应该始终以规范化的数据库设计为目标,然后您必须决定、尝试和测试哪些字段 duplicated/denormalised 可以提高应用程序的性能。示例:您为每个用户删除了 1 个查询。 UI 需要一个额外的字段并且可以快速复制它,等等

使用非规范化,您需要付出额外的代价。您必须根据主集合更新非规范化字段。

示例: 假设您是 Authors 和 Articles 集合。每篇文章都有作者姓名。作者可能会更改他的名字。对于标准化场景,它工作正常。对于非规范化场景,您必须使用新名称更新作者文档名称和该作者拥有的每篇文章。

保持规范化设计让您的生活更轻松,但非规范化最终成为必要。

从 MeteorJs 的角度来看:在规范化场景中,您将数据从 2 个集合发送到客户端。对于非规范化场景,您只发送 1 个集合。您也可以反应性地加入服务器并向客户端发送 1 个集合,尽管它会增加 RAM 使用量,因为服务器上的 MergeBox

非规范化非常适合您的应用程序需求。您可以使用 Kadira 找到使您的应用程序更快的方法。在您尝试提高性能时,数据库设计只是众多因素中的一个。