MongoDB-необходим ли DBREF?

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

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

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

3 ответов


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

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

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

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


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

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


с docs:

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

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