Как создать отношения, используя MongoDB? - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над веб-приложением, которое использует базу данных mongoDB и express / nodeJS.Я хочу создать проект, в котором у меня есть пользователи, а пользователи могут иметь посты, которые могут иметь много атрибутов, таких как заголовок, создатель и дата.Я запутался, как это сделать, чтобы избежать репликации в моей базе данных.Я попробовал ссылки, используя идентификаторы в списке всех сообщений пользователей, как эта идея: [postID1, postID2, postID3 и т. Д ...].Проблема в том, что я хочу иметь возможность использовать запрос обратно ко всем публикациям пользователей и отображать их в шаблоне ejs, но я не знаю, как это сделать.Как бы я использовал ссылки?Что я должен сделать, чтобы сделать эту систему моделирования оптимальной для отношений?

Любая помощь будет принята с благодарностью!

Спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Это классические отношения родитель-ребенок, и ваша проблема в том, что вы сохраняете отношения в неправильной записи :-).Родитель никогда не должен содержать ссылку на детей.Вместо этого у каждого ребенка должна быть ссылка на родителя.Почему не наоборот?Это немного историческая особенность: это сделано так, потому что классическая реляционная таблица не может иметь несколько значений для одного поля, что означает, что вы не можете легко хранить несколько дочерних идентификаторов в реляционной таблице, тогда как каждый дочерний элемент будет толькокогда у кого-то есть один родитель, легко установить одно поле в дочернем элементе.Документ Mongo может иметь несколько значений в одном поле, используя массивы, но если у вас нет на то веских причин для этого, просто лучше следовать исторической парадигме.

Какэто применимо в вашей ситуации?То, что вы пытаетесь сделать, это хранить ссылки на все дочерние элементы (т.е. идентификаторы записей) в виде списка в родительском элементе (то есть массива в пользовательском документе).Это не обычный способ сделать это.Вместо этого в каждом дочернем элементе (т. Е. В каждом сообщении) есть поле с именем user_id и сохраняйте там userID.

Далее убедитесь, что вы создали индекс для поля user_id.

СВ этой настройке легко взять сообщение и выяснить, кем был пользователь (просто посмотрите на поле user_id).А если вы хотите найти все сообщения пользователя, просто выполните posts.find ({user_id: 'XXXX'}).Если у вас есть индекс для этого поля, поиск будет выполнен быстро.

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

РЕДАКТИРОВАТЬ Если у вас do есть веская причина для хранениядочерние ссылки в родительском элементе, затем предполагается, что структура выглядит следующим образом: user = {posts: [postID1, postID2, postID3, ...]} Вы можете найти пользователя для определенного сообщения по user.find ({posts: "XXXX"}).MongoDB достаточно умен, чтобы знать, что вы ищете пользователя, в котором массив записей содержит элемент «XXX».И если вы создаете индекс для поля сообщений, тогда запрос должен быть довольно быстрым.

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