2017-08-25 59 views
1

有了這個簡單的例子 (使用短的ObjectId,使其更容易閱讀)MongoDB模式設計:通過名稱引用ID與引用?

標籤文件:

{ 
    _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集合中找到,我們就可以知道沒有加入($lookup)操作,這應該是更快的標籤的名稱。

如果應用程序在創建和修改圖書之前執行標記檢查,這應該也是可行的,並且更快。

我仍然不很肯定:

  1. 是否有關於「按名稱引用」任何藏起來?
  2. 在「查找所有帶有給定標籤的書籍」時,「名稱引用」會更慢嗎?也許ObjectId是某種特殊的?

謝謝。

回答

0

我會說這取決於你的用例是什麼標籤。正如您所說,如果您通過id引用,則執行$lookup來檢索標籤名稱會更加昂貴。另一方面,如果您預計標籤名稱可能會頻繁更改,那麼包含該標籤的圖書集合中的所有文檔都需要在每次更改時更新。

ObjectID只是一個12字節的值,如果在插入的文檔中不存在_id,則該值由驅動程序自動生成。有關更多信息,請參閱MongoDB docs。唯一的「特殊行爲」將是事實_idhas an index by default。一個索引通常會加快查找速度,但可以在任何字段創建索引,而不僅僅是_id。其實_id不需要是ObjectID。例如,具有整數_id值的文檔是完全合法的:

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