MongoDB模式设计:按ID引用还是按名称引用?
通过这个简单的例子 (使用简短的ObjectId使其更易于阅读) 标签文件:MongoDB模式设计:按ID引用还是按名称引用?,mongodb,database-design,Mongodb,Database Design,通过这个简单的例子 (使用简短的ObjectId使其更易于阅读) 标签文件: { _id: ObjectId('0001'), name: 'JavaScript', // other data }, { _id: ObjectId('0002'), name: 'MongoDB', // other data }, ... 假设我们需要一个单独的标签集合,例如,我们需要在每个标签上存储一些信息 如果通过ID引用: // a book docum
{
_id: ObjectId('0001'),
name: 'JavaScript',
// other data
},
{
_id: ObjectId('0002'),
name: 'MongoDB',
// other data
},
...
假设我们需要一个单独的标签
集合,例如,我们需要在每个标签上存储一些信息
如果通过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引用”是可行的
我在想,如果使用“按名称引用”,对图书信息的查询只需要在图书
集合中查找,我们就可以知道标签的名称,而不需要连接($lookup
)操作,这应该会更快
如果应用程序在创建和修改书籍之前执行标记检查,那么这也应该是可行的,而且速度更快
我还是不太确定:
ObjectId
有点特别谢谢。我想说这取决于标签的用例。正如您所说,如果您按id引用标记名,则执行
$lookup
检索标记名的成本会更高。另一方面,如果您预计标记名可能会频繁更改,则每次更改都需要更新包含该标记的图书集中的所有文档
ObjectID只是一个12字节的值,如果插入的文档中没有\u id
,驱动程序会自动生成该值。有关更多信息,请参阅。唯一的“特殊行为”是\u id
。索引通常会加快查找速度,但可以在任何字段上创建索引,而不仅仅是\u id
实际上,\u id
不需要是ObjectID。具有整数\u id
值的文档是完全合法的,例如:
{
_id: 1,
name: 'Javascript'
},
{
_id: 2,
name: 'MongoDB'
},
我认为这取决于标签的用例。正如您所说,如果您按id引用标记名,则执行
$lookup
检索标记名的成本会更高。另一方面,如果您预计标记名可能会频繁更改,则每次更改都需要更新包含该标记的图书集中的所有文档
ObjectID只是一个12字节的值,如果插入的文档中没有\u id
,驱动程序会自动生成该值。有关更多信息,请参阅。唯一的“特殊行为”是\u id
。索引通常会加快查找速度,但可以在任何字段上创建索引,而不仅仅是\u id
实际上,\u id
不需要是ObjectID。具有整数\u id
值的文档是完全合法的,例如:
{
_id: 1,
name: 'Javascript'
},
{
_id: 2,
name: 'MongoDB'
},