【问题标题】:MongoDB - Denormalization / model opinionMongoDB - 非规范化/模型意见
【发布时间】:2012-02-26 12:46:24
【问题描述】:

我一直在使用 mongo,但来自 RDBMS 背景,面临着关于非规范化和通用数据建模的可能显而易见的问题。

如果我有一个包含子文档数组的文档类型,则每个子文档都有一个状态码。

在关系世界中,我会在记录中添加一个外键,StatusId,很简单。 在 mongodb 中,您是否会对“状态”中的关键数据片段进行非规范化,例如代码和 desc 并保持 objectid 引用另一个适当状态的集合。我想下一个问题是设计问题,如果修改了状态文档,我需要修改非规范化数据吗?

关于同一主题的另一个问题是如何为事务表建模,比如我有事件和人员,这些事件可能非常精细,比如随着时间的推移可能会导致许多记录的时间表。根据我所见,这似乎是文档子数组/子数组的一个很好的候选者,当然可以为速度编制索引。

因此是否可以只查询/查找子数组或其中的一部分?并且考虑到文档大小的 16mb 限制,而我只是限制了此人的交易历史?或者交易历史记录应该是一个单独的集合,其中一个 onjid 引用了这个人?

感谢您的任何意见

山姆

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    或者交易历史应该是一个单独的集合,带有一个引用该人的 onjid?

    我认为this S/O question 可能会帮助您理解原因。

    如果修改了状态文档,我需要修改非规范化数据吗?

    是的,这是 MongoDB 中的标准权衡。你会经常遇到这个问题。您可能需要利用 Queue 结构来确保数据在多个集合中保持一致。

    因此是否可以只查询/查找子数组或其中的一部分?

    这是 MongoDB 特有的一项艰巨任务。使用基本查询语法,您只能有限地支持处理对象数组。新的“聚合框架”在这里实际上要好得多,但它在稳定版本中不可用。

    【讨论】:

      【解决方案2】:

      您所有的“如何建模这个或那个”都无法真正得到回答,因为良好的架构设计取决于很多因素(访问模式、硬件特性、是否使用集群等)。

      如果修改了状态文档,我需要修改非规范化数据吗?

      通常是的,这就是非规范化的缺点。但有时您不必这样做(一些社交网站存储带有照片标签的用户名,并且在用户更改姓名时不会更新)。

      只查询/查找子数组或其中的一部分?

      目前无法仅获取数组的一部分(当然,除非使用 map/reduce)。

      鉴于 4mb 的限制

      你是从哪里得到这个的?目前是 16mb。

      【讨论】:

      • 感谢塞尔吉奥,当然我并不是要一个明确的 manswer - 更多的是其他人使用 mongo/nosql 的经验。我最近看到的网络广播中的 4mb,它显然有点旧(sry)
      【解决方案3】:

      虽然架构设计确实考虑了许多因素,但对数据进行非规范化的需求通常会出现在某个地方。我倾向于在使用 MongoDB 的应用程序中利用非规范化,因为我觉得它很适合存储非规范化数据:

      • 无需额外的色谱柱维护
      • 支持将哈希和数组作为字段类型(非常适合存储非规范化字段)
      • 快速的非阻塞写入降低了同步数据的成本
      • 文档大小的增长对性能的影响很小(大部分情况下)

      有一些 gem 可以帮助您管理非规范化数据,包括对其进行设置和保持同步。如果您使用的是 Mongoid,请尝试 mongoid_alize。免责声明:我是 mongoid_alize 的作者和维护者。

      【讨论】:

        猜你喜欢
        • 2015-02-01
        • 2015-01-28
        • 2011-07-18
        • 2012-07-01
        • 1970-01-01
        • 2016-12-14
        • 2023-04-01
        • 2016-05-30
        • 1970-01-01
        相关资源
        最近更新 更多