侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

【译】MongoDB Shema 设计的6条经验法则 3

2022-07-03 星期日 / 0 评论 / 0 点赞 / 54 阅读 / 5377 字

6 Rules of Thumb for MongoDB Schema Design: Part 3作者 William Zola, Lead Technical Support Engineer a

.

6 Rules of Thumb for MongoDB Schema Design: Part 3

作者 William Zola, Lead Technical Support Engineer at MongoDB

.

这是在MongoDB 中对 1对N 关系建模的最后一站。在第一篇博文中,我谈到了三个对 1对N 建模的基本方法。上一篇中,谈到了这些基本方法的一些拓展:双向引用反范式化

反范式化能能让你避免那些 以高成本且复杂的更新为代价的 应用级别的联接。如果那些字段的读取比更新更加频繁,那对这一两个这样的字段做反范式化是有意义的。

如果你忘记了,参看 第一部分第二部分

看看这些选择

回顾一下:

  • 你可以 内嵌, 从 1端 引用,或者从 N端 引用, 又或者结合这些技巧中的某两种。

  • 你可以任意反范式化任意多个字段到 1端 或者 N端

特别是 反范式化,它给了你很多选择: 如果有关系中 8个选项可以反范式化,就有 28 种不同的方式去做反范式化(包括完全不做反范式化)。在将三种不同的引用方法组合到一起,你可以有超过3000种方法来建立关系模型。

你猜会怎么样?你陷入了 “ 选择悖论 ” —— 因为你有这么多潜在的方式来建立 1对N 关系模型,现在如何建模的时候将更加困难。

经验法则:穿越彩虹的指南

这里是经验法则可以指引你通过这无数的选择。

  • 一,使用 内嵌,除非有一个明确的原因。

  • 二,需要访问对象本身,可以是一个明确的不使用内嵌的理由。

  • 三, 数组不应该无限的增长。如果 很多 一端种 有超过几百个文档,那就不要使用内嵌。如果 很多 一段中有超过几千个文档,那就不要使用 ObjectID 引用数组。高基数数组是一个明显的不使用内嵌的理由。

  • 四,不要害怕应用程序级别的联接:如果正确索引并使用投影操作(见 [第二部分](at the expense of having more complex and expensive update)),那么 应用程序级别联接 并不会比 关系数据库中服务器端联接 的成本高。

  • 五,考虑 非范式化 的 读/写 比率。一个经常读取且很少更新的字段是很好的反范式化的选项。如果你范

  • 六,MongoDB 中,如何对你的数据建模大体上取决于 你的特定应用程序中数据的访问模式。你可以过调整你的数据的结构,从而使之匹配 你的应用程序的查询和更新数据的方式。

您的彩虹指南

在 MongoDB 中建模 1对N 关系是,你有多种不同的选择,因此你必须仔细考虑你的数据的结构。

你需要考虑的主要准则有:

  • 这个关系的基数是什么:是 1对多1对很多,还是 一对非常多

  • 你是不是需要单独访问 N端 对象,还是只是需要在父对象的上下文中进行访问?

  • 这个特定字段的读取与更新的比率是多少?

构建数据的的主要选择有:

  • 对与 1对少, 你可以使用一组内嵌式的文档。

  • 对于 1对很多 或者当 N端 必须单独使用的情况中,你应该使用 引用数组 的方式。你也可以 用在N端使用 父引用 的方法 如果这样做可以优化的你数据访问模式。

  • 对于 1对非常, 你应当使用在存放 N端 的文档中 使用 父引用

一旦你决定了数据的整体结构,那你就可以选择在不同文档间进行反范式化,通过 将 1端的数据 范式化到 N端 或者 从 N端 反范式化 到 1端

这些操作只合适对经常读取,读取比更新频繁,并且对一致性没有强烈的要求的字段,因为更新 被反范式化的值很慢,成本较高 并且 不是原子性的。

生产力和灵活性

综上结果,MongoDB 能让你让你设计数据看来匹配你的应用程序的需求。你可以在 MongoDB 中结构化你的数据,从而令其轻松的适应变化,最大程度支持在你应用程序的进行你需要的查询和更新。

.
.

广告 广告

评论区