Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB模式设计:按ID引用还是按名称引用?_Mongodb_Database Design - Fatal编程技术网

MongoDB模式设计:按ID引用还是按名称引用?

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

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

标签文件:

{
    _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'
    },