带或不带空占位符的 MongoDB 模式设计

标签 mongodb database-design model schema

我仍然习惯于使用无模式的面向文档的数据库,我想知道关于应用程序模型中模式设计的普遍接受的做法是什么。

具体来说,我想知道在像这样保存到 mongodb 时在应用程序模型中使用强制模式是否是一个好习惯:

{
    _id: "foobar",
    name: "John"
    billing: {
        address: "8237 Landeau Lane",
        city: "Eden Prairie",
        state: "MN",
        postal: null
    }
    balance: null,
    last_activity: null
}

与仅存储这样使用的字段相比:

{
    _id: "foobar",
    name: "John"
    billing: {
        address: "8237 Landeau Lane",
        city: "Eden Prairie",
        state: "MN"
    }
}

我喜欢前者是 self 描述的,而后者不对模型架构的可变性做出任何假设。

我喜欢第一个选项,因为它可以很容易地一目了然地看到模型使用了哪些字段但当前未指定,但如果我更新每个文档以反射(reflect)新的模式设计似乎会很麻烦想添加一个额外的字段,例如 favorite_color

大多数经验丰富的 mongodb 用户如何处理这个问题?

最佳答案

我建议采用第二种方法。

  1. 如果您查看源代码中的实体类,您总能看到预期的结构。还是使用动态语言而不创建实体?
  2. 您为每条记录节省了大量空间,因为您不必存储空列名。这在小型收藏品上可能并不昂贵。但总的来说,有数百万条记录,我什至会去缩短字段名称。
  3. 正如您已经提到的。通过指定可选的列名称,您可以创建一个模式,如果您想要遵循该模式,则必须在添加新字段时更新所有现有记录。对于大型数据库来说,这又是一个坏主意。

无论如何,这都会降低您的数据库大小。如果您的目标不是很多 GB 或 TB 的数据,那么这两种方法都可以。但是,如果您预测,您的数据库可能会变得非常大,我会做任何事情来缩减大小。为列名花费 30-40% 的存储空间是个坏主意。

关于带或不带空占位符的 MongoDB 模式设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14499281/

相关文章:

mysql - 我可以将一个产品的多个附加组件存储为 JSON 形式的表列中吗?

asp.net-mvc-3 - MVC2 - 如何在模板中获取父模型(容器)

c# - 我将如何使用最小起订量来测试 MongoDB 服务层?

MongoDB 聚合项目字符串到 ObjectId

spring - MongoDB - 如何在 Spring 的主要连任期间处理写入失败?

ruby-on-rails - 如何接受逗号分隔列表来为模型构建标签?

ruby-on-rails - 如何基于自定义模型方法查询Rails/ActiveRecord模型?

java - 当我想以毫秒为单位获取 unix 时间时,Mongodb 时间戳输出格式返回 "$numberLong"对象

php - 在数据库中存储大量标记的最佳方法是什么?

database - 设计具有相似但不同模型的数据库