Подтвердить что ты не робот

MongoDB - нужен DBREF?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Из docs:

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

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