Монго несколько запросов или нормализация базы данных - PullRequest
2 голосов
/ 13 сентября 2011

Я использую MongoDB для своей базы данных.Запрос, над которым я сейчас работаю, выявил возможный недостаток в моей схеме.Ниже приведен соответствующий макет моих коллекций. Обратите внимание, что games.players - это массив из 2 игроков, так как игра в шахматы.

users {_id, username, ...}
games {_id, players[], ...}
msgs {_id, username, gameid, time, msg}

Мне нужны следующие данные:

All msgs for games which a user is in which is newer than a given timestamp.

ВБаза данных SQL, мой запрос будет выглядеть примерно так:

SELECT * FROM msgs WHERE time>=$time AND gameid IN
    (SELECT _id FROM games WHERE players=$username);

Но Mongo не является реляционной базой данных, поэтому не поддерживает подзапросы или объединения.Я вижу два возможных решения. Что было бы лучше с точки зрения производительности и эффективности?

  1. Несколько запросов
    • Выберите игры, в которых участвует пользователь, а затем используйте $ in для сопоставления с сообщениями.gameid by.
    • Другое?
  2. Нормализация
    • Сделать так, чтобы users.games содержал все игры, в которых участвует пользователь.
    • Копирование игр.players для msgs.players от msgs.gameid
    • и т. д.,

Ответы [ 2 ]

2 голосов
/ 17 июля 2013

Я относительный новичок в MongoDB, но я часто использую комбинацию двух подходов.Некоторые вещи - например, имена пользователей - часто дублируются для упрощения запросов, используемых для отображения, но в любое время, когда мне нужно сделать больше, чем отображение информации, я заканчиваю писать несколько запросов, иногда на 2 или 3 уровнях, используя $ in, чтобы собрать вседокументы, с которыми мне нужно работать для данной операции.

0 голосов
/ 13 сентября 2011

Вы можете "нормализовать" себя. Я бы добавил массив пользователям, в котором перечислены игры, в которые он входит;

пользователи {_id, username, games = {game1, game2, game3}}

теперь вы можете сделать запрос к сообщениям, где время> время $ и {games._id "находятся в" users.games}

Вам придется вести список игр для каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...