Показать сообщение отдельно
Старый 26.11.2014, 13:10   #3
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Работа с коллекциями в mongodb

Я придерживаюсь таких правил:
1. Если это one-to-one отношение, рассматривать как вложенный объект.
2. Если число суб-документов большое, рассматривать как отдельную коллекцию.
3. Если к индивидуальному суб-документу нужно часто обращаться, рассматривать как отдельную коллекцию.
4. Если число суб-документов фиксировано для относящегося документа, рассматривать key,value в документе.
5. Если суб-документы нужны всегда при запросе документа, то рассматривать как суб-документ.
6. Если суб-документ может "передаваться" в другие документы, то россматривать отдельную коллекцию.

Таким образом например, если у тебя ресурсы например: золото, металл, газ, то будет в юзере как:
{
    _id: ...,
    ...,
    resources: {
        gold: 64,
        metal: 0,
        gas: 128
    }
}
А вот постройки, к ним будут обращаться другие пользователи, и эти данные постоянно меняются, нужно обращаться индивидуально к постройке и т.п. Тут я бы сделал другую коллекцию.
Еще если у тебя например один большой мир, то если это отдельная коллекция с 2d индексом по координатам, то будет легко получить все постройки в радиусе/регионе, а если это будут суб-документы, то такого не получится.
Обращение к постройке по ID тоже проще в разы если это отдельная коллекция.

Шмот, тем более, т.к. если владелец шмота может меняться, то тут будет легче как отдельная коллекция, т.к. просто меняешь `owner` поле.
Также обращение к шмотке по ID в разы проще.

Учти что тут важна индексация, ты хочешь минимизировать во первых количество данных которые постоянно таскаешь между бд и приложением (обычно запрашивай только те поля которые нужны). Также важно всегда бить по индексу. Несколько запросов по индексам - это в полне нормально, а вот один запрос с убер-документом, и потом парсингом этого большого дела - плохо.

Я бы кинул постройки и шмот как отдельные коллекции, и ресурсы (если их менее 16) как вложенный объект (key,value) в юзере.

В плане token'а, я так понимаю это тип доступа к API по token'у? Тут лучше храни это дело как отдельная коллекция, и если у тебя разные клиенты (пользователи API) то пусть они имеют разные token'ы.
Это нормально сделать запрос на коллекцию где token на самом деле _id, и далее получить id пользователя.
Но если у тебя не будет несколько клиентов, или все твои клиенты - твои личные, тогда не парься с token'ами, имей сессию на стороне API с аутентификацией, и в сессии храни id пользователя, а сессию восстанавливай из пиченек (cookies), убедись что печеньки HTTPOnly и Secure.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Lestar (26.11.2014)