MongoDB架构设计:ID引用与名称引用?

时间:2017-08-25 14:42:31

标签: mongodb database-design

用这个简单的例子 (使用简短的ObjectId使其更容易阅读)

标记文档:

{
    _id: ObjectId('0001'),
    name: 'JavaScript',
    // other data
},
{
    _id: ObjectId('0002'),
    name: 'MongoDB',
    // other data
},
...

假设我们需要一个单独的tag集合,例如我们需要在每个标签上存储一些信息。

如果通过ID引用:

// a book document
{
    _id: ObjectId('9876'),
    title: 'MEAN Web Development',
    tags: [ObjectId('0001'), ObjectId('0002'), ...]
}

如果按名称引用:

{
    _id: ObjectId('9876'),
    title: 'MEAN Web Development',
    tags: ['JavaScript', 'MongoDB', ...]
}

已知" ID"是可行的。

我想如果使用"按姓名引用",只需要在book集合中查找书籍信息,我们就可以知道标签&# 39;没有连接($lookup)操作的名称,应该更快。

如果应用程序在书籍创建和修改之前执行标签检查,这也应该是可行的,并且更快。

我还不太确定:

  1. 是否有任何隐藏的"参考名称" ?
  2. 将"引用名称" "找到所有带有给定标签的书籍#34; ?也许ObjectId有点特别吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:0)

我想说这取决于你的用例是什么标签。正如您所说,如果您通过id引用,则$lookup检索标记名称会更加昂贵。另一方面,如果您希望标签名称可能经常更改,则每次更改时都需要更新包含该标签的书籍集中的所有文档。

ObjectID只是一个12字节的值,如果插入的文档中没有_id,则由驱动程序自动生成。有关详细信息,请参阅MongoDB docs。唯一的“特殊行为”是_id has an index by default。索引通常会加速查找,但可以在任何字段上创建索引,而不仅仅是_id

实际上,_id不需要是ObjectID。例如,具有整数_id值的文档是完全合法的:

{
    _id: 1,
    name: 'Javascript'
},
{
    _id: 2,
    name: 'MongoDB'
},