Я использую 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 не является реляционной базой данных, поэтому не поддерживает подзапросы или объединения.Я вижу два возможных решения. Что было бы лучше с точки зрения производительности и эффективности?
- Несколько запросов
- Выберите игры, в которых участвует пользователь, а затем используйте $ in для сопоставления с сообщениями.gameid by.
- Другое?
- Нормализация
- Сделать так, чтобы users.games содержал все игры, в которых участвует пользователь.
- Копирование игр.players для msgs.players от msgs.gameid
- и т. д.,