MongoDB - нужен ли DBREF? - PullRequest
       19

MongoDB - нужен ли DBREF?

21 голосов
/ 23 февраля 2012

Используя тип данных DBREF в MongoDB, документ может выглядеть так, как показано ниже.Но наличие поля $ref в каждой строке кажется избыточным, так как каждая строка явно указывает на коллекцию * 1004. *

Есть ли способ ссылаться на другие документы, не имея несколько избыточное поле $ref?

{
    $id: {$oid : "4f4603820e25f4c515000001"},
    title:   "User group",
    users: [ 
        {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true }
    ]
],

Ответы [ 3 ]

37 голосов
/ 23 февраля 2012

Dbref, на мой взгляд, следует избегать при работе с mongodb, по крайней мере, если вы работаете с большими системами, которые требуют масштабируемости.

Как я знаю, все драйверы делают дополнительный запрос на загрузку DBRef, поэтому это не '1003 * join ' в базе данных, это очень дорого.

Есть ли способ ссылаться на другие документы, не имея избыточного поля $ ref?

Да, помнить о ссылках, создавать соглашения об именах для ' внешние ключи '(что-то вроде RefUserId или просто UserId) и сохраняют только id ссылочного документа.Загружайте ссылочные документы самостоятельно, когда это необходимо.Также держите глаза открытыми на любую денормализацию, вложение, которое вы можете сделать, потому что это обычно значительно улучшает производительность.

7 голосов
/ 23 февраля 2012

Если вы не используете специфичные для драйвера методы для доступа к dbref, это не нужно.

В тех случаях, когда вы управляете объединением вручную (т.е. вы знаете, к какой другой коллекции «присоединяться»), достаточно сохранить только ObjectId.

2 голосов
/ 05 января 2016

Из документов :

Ручные ссылки являются альтернативой, а документы говорят ручные ссылки предпочтительнее DBREF ( хотя я не уверен, почему ).DBREFs полезны, когда указанный объект находится в другой базе данных или если имя коллекции не было бы очевидным.

Денормализация / внедрение предпочтительнее любого вида ссылок, потому что тогда вы получаете атомарные обновления и вам не нужноповторно запросить связанные данные.

...