Моделирование пользовательской базы данных в MongoDB - PullRequest
1 голос
/ 09 сентября 2011

У меня есть две таблицы.

Фильмы, в которых перечислены все фильмы в базе данных.
Пользователи, у которых есть пользователи.

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

Однако, поскольку вы не можете сделать это в MongoDB, что мне делать?Я хочу, чтобы можно было найти все фильмы, которые нравятся определенному пользователю, а также всех пользователей, которым нравится определенный фильм, и фильмы, которые нравятся данному набору пользователей.

Встроенные документы?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Для отношений «многие ко многим» между фильмами и пользователями, подобными этим, у меня, вероятно, будут отдельные коллекции для каждого, но денормализовать пользователей, которым нравится фильм, в коллекцию movies, добавив их _id и * 1003.* поля в массиве likes.

Таким образом, вы можете извлекать имена пользователей, которым нравится фильм, без необходимости отдельного поиска в коллекции users, но при этом есть дополнительные пользовательские поля, которыене будет встроен в фильмы.

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

db.movies

{
    _id: <objectid>,
    name:"Star Wars",
    likes: [ 
        { userid: <user-objectid>, name: "John Smith" },
        { userid: <user-objectid>, name: "Alice Brown" }
    ]
}

db.users

{
    _id: <objectid>,
    name: "John Smith",
    username: "jsmith",
    passwordhash: "d131dd02c5e6eec4693d"
}

Фильмы, которые нравится определенному пользователю

db.movies.find( { "likes.userid": <user-objectid> }, { "name": 1 } );

Пользователи, которыекак определенный фильм

db.movies.find( { "_id": <movie-objectid> }, 
    { "likes.userid": 1, "likes.name": 1 } );

Фильмы, которые данный набор пользователей, как

db.movies.find( { "likes.userid": 
    { $in: [ <user1-objectid>, <user2-objectid> ] } },
    { "name": 1 } );
1 голос
/ 09 сентября 2011

Вы можете сделать это в MongoDB, вы просто не можете выполнить операцию соединения на уровне базы данных, вы должны сделать это на уровне приложения.

Если у вас есть миллионы фильмов и миллионы пользователей, у вас есть , чтобы сделать это с помощью объединенной коллекции, потому что вы не можете вписать число лайков для одного фильма или одного пользователя в любой документ.

  1. Поиск пользователя и получение его _id
  2. Поиск документов UserMovie с соответствующими значениями _id
  3. Поиск фильмов при необходимости

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

Возможна оптимизация
Одной из оптимизаций, которую вы можете попробовать по этой схеме, является создание документов в коллекции UserMovie, которые содержат несколько взаимосвязей, а не использование одного документа для каждой взаимосвязи (как в SQL).

Например, если наиболее распространенным шаблоном доступа является поиск фильмов, которые нравятся пользователю, вы можете сгруппировать их по пользователю и поместить в один или несколько документов, проиндексированных по этому идентификатору пользователя. Посмотрите на StatementGroups в этом сообщении в блоге для более полного объяснения.

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