c# - MongoDB、C# 和 NoRM + 非规范化

标签 c# mongodb denormalization mongodb-.net-driver norm

我正在尝试使用 MongoDB、C# 和 NoRM在一些示例项目上工作,但在这一点上,我很难将我的头脑围绕在数据模型上。用RDBMS的相关数据是没有问题的。然而,在 MongoDB 中,我很难决定如何处理它们。

让我们以 StackOverflow 为例...我完全理解问题页面上的大部分数据都应该包含在一个文档中。标题、问题文本、修订、评论……都在一个文档对象中。

我开始模糊的地方是关于用户数据的问题,例如用户名、头像、声誉(变化尤其频繁)...您是否每次都去规范化和更新数千条文档记录是用户更改还是您以某种方式将数据链接在一起?

在不导致每次页面加载时发生大量查询的情况下,实现用户关系的最有效方法是什么?我注意到 DbReference<T>输入 NoRM,但还没有找到使用它的好方法。如果我有可以为空的可选关系怎么办?

感谢您的洞察!

最佳答案

我发现的平衡点是使用 SQL 作为规范化数据库,使用 Mongo 作为非规范化副本。我使用 ESB 使它们保持同步。我使用了一个概念,我称之为“准备好的文档”和“存储的文档”。存储的文档是只保存在 mongo 中的数据。对于非关系数据很有用。准备好的文档包含可以使用规范化数据库中的数据重建的数据。它们在某种程度上充当活缓存 - 如果数据不同步,它们可以从头开始重建(在复杂的文档中,这是一个昂贵的过程,因为这些文档需要重建许多查询)。它们也可以一次更新一个字段。这就是服务总线的用武之地。它响应规范化数据库更新后发送的事件,然后更新相关的 mongo 准备文档。

充分利用每个数据库的优势。允许 SQL 成为确保数据完整性的写入数据库。让 Mongo 成为一个速度极快且可以包含子文档的只读数据库,这样您就需要更少的查询。

** 编辑 ** 我刚刚重新阅读了您的问题,并意识到您的实际要求。我留下我原来的答案,以防万一它有帮助。

我处理您给出的 Stackoverflow 示例的方式是将用户 ID 存储在每个评论中。您将加载包含所有评论的帖子。那是一个查询。

然后,您将遍历评论数据并提取需要加载的用户 ID 数组。然后将它们作为批处理查询加载(使用 Q.In() 查询运算符)。总共有两个查询。然后,您需要将数据合并为最终形式。您需要在何时这样做和何时使用类似 ESB 之类的工具来手动更新每个文档之间取得平衡。使用最适合数据结构的每个单独场景的方法。

关于c# - MongoDB、C# 和 NoRM + 非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353729/

相关文章:

floating-point - 最大的非规范化和规范化数是多少?(64 位,IEEE 754-1985)

sql - 通过键从非规范化数据库中选择所有关联记录

c# - 表达式树参数是否需要重用相同的实例?

sql - 如何使用 $lookup MongoDB 进行 LEFT JOIN

C# - 正则表达式 - 根据特定的命名模式匹配文件名

MongoDB - 通过数组中多个对象的相同字段查询文档

javascript - 在字符串中查找数组中所有出现的元素

elasticsearch - Logstash -> Elasticsearch - 更新非规范化数据

c# - 将 List<MyObject> 转换为 IEnumerable<MyInterface>

c# - 在什么时候我需要处理我的自定义 WPF 用户控件?