我是MongoDB新手——来自关系数据库背景.我想设计一个带有一些注释的问题 struct ,但我不知道使用哪个关系来进行注释:embed还是reference

一个带有一些注释的问题,比如stackoverflow,其 struct 如下:

Question
    title = 'aaa'
    content = bbb'
    comments = ???

首先,我想使用嵌入式注释(我认为MongoDB中建议使用embed条),如下所示:

Question
    title = 'aaa'
    content = 'bbb'
    comments = [ { content = 'xxx', createdAt = 'yyy'}, 
                 { content = 'xxx', createdAt = 'yyy'}, 
                 { content = 'xxx', createdAt = 'yyy'} ]

这很清楚,但我担心这个 case :If I want to edit a specified comment, how do I get its content and its question?没有_id个让我找到一个,也没有question_ref个让我找到它的问题.(我是个新手,我不知道没有_idquestion_ref有没有办法做到这一点.)

我必须用ref而不是embed吗?然后我必须创建一个新的 comments 集?

推荐答案

这与其说是一门科学,不如说是一门艺术.Mongo Documentation on Schemas是一个很好的参考,但这里有一些事情需要考虑:

  • 尽可能多地投入

    文档数据库的乐趣在于它消除了很多连接.你的第一react 应该是尽可能多地放在一个文档中.由于MongoDB文档具有 struct ,而且您可以在该 struct 中高效地进行查询(这意味着您可以获取所需的文档部分,因此文档大小不应该让您太担心),因此不需要像SQL中那样立即规范化数据.特别是,除了父文档之外没有用处的任何数据都应该是同一文档的一部分.

  • 可以从多个地方引用到自己的集合中的独立数据.

    这与其说是一个"存储空间"问题,不如说是一个"数据一致性"问题.如果多条记录引用同一数据,那么更新一条记录并在其他地方保留对它的引用会更高效,也不容易出错.

  • 文档大小注意事项

    MongoDB对单个文档施加4MB(16MB,1.8)大小限制.在一个GB数据量的世界里,这听起来很小,但它也是3万条推文或250个典型的堆栈溢出答案或20张闪烁的照片.另一方面,这远远超过了一个人在一个典型的网页上一次想要呈现的信息.首先考虑什么会使你的查询更容易.在许多情况下,对文档大小的担忧会导致过早的优化.

  • 复杂的数据 struct :

    MongoDB可以存储任意深度嵌套的数据 struct ,但不能有效地搜索它们.如果数据形成树、林或图形,则实际上需要将每个 node 及其边存储在单独的文档中.(注意,有专门为这种类型的数据设计的数据存储,这也是人们应该考虑的).

    它还有been pointed out个参数,比返回文档中元素子集的可能性要大得多.如果您需要从每个文档中挑选一些内容,那么将它们分开会更容易.

  • 数据一致性

    MongoDB在效率和一致性之间进行权衡.规则是对单个文档的更改是alwaysatomic,而对多个文档的更新永远不应该被认为是原子的.也无法在服务器上"锁定"记录(您可以使用例如"锁定"字段将其构建到客户机的逻辑中).设计模式时,要考虑如何保持数据一致性.一般来说,文档中保存的内容越多越好.

对于您所描述的内容,我将嵌入注释,并 for each 注释提供一个带有ObjectID的id字段.ObjectID中嵌入了一个时间戳,因此如果您愿意,可以使用它而不是在创建时使用它.

Mongodb相关问答推荐

Golang中的Mongo中值运算

Mongo,通过 Lookup 计算多个文档中数组中的项目

Mongodb 按数组元素聚合组

在 Mongo 聚合中,可以通过分组生成 3 个不同的计数

MongoDB查询仅返回嵌入文档

为什么使用整数作为 pymongo 的键不起作用?

如何使用 mongoose 从 MongoDb 获取数据?

声明多个模式后无法从数据库中获取数据(mongoose + express + mongodb

mongo _id 字段重复键错误

使用 mgo 存储嵌套 struct

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

Clojure 和 NoSQL 数据库

C# mongodb driver 2.0 - 如何在批量操作中更新插入?

使用已排序的数据获取不同的值

Django admin 和 MongoDB,可能吗?

如何在 MongoDB 聚合查询中使用 $hint?

带有部分字符串的mongoose文本搜索

插入违反唯一索引的 MongoDB 文档时如何捕获错误?

Mongoose - 获取 _id 列表而不是具有 _id 的对象数组

MongoDB Compass 中 JSON 输入意外结束