Мне было интересно, какова наилучшая схема для сценария пользователя/уведомлений, подобного следующему:
- У вас есть несколько пользователей.
- У вас есть несколько уведомлений, которые могут быть для одного пользователя, для некоторых пользователей или для всех пользователей.
- Вам нужна запись уведомления «прочитано» в хранилище, чтобы узнать, прочитал ли пользователь уведомление или нет.
Вариант первый
Встроенная схема уведомлений
Notifications = new Schema ( {
message : String,
date : { type : Date, default: Date.now() }
read : { type: Boolean, default : false }
});
User = new Schema( {
username : String,
name : String,
notifications : [Notifications]
});
Плюсы:
- Отображать данные очень просто, так как вызов User.find() будет отображать уведомления как объект массива.
Минусы:
- Когда вы создаете уведомление для каждого пользователя, вам нужно сделать .push для каждого встроенного уведомления.
- Несколько записей уведомлений для каждого пользователя (несколько данных в базе данных)
- Гигантский встроенный документ (я читал что-то о лимите в 4 МБ)
- Поскольку это встроенный документ ( mongoose DocumentArray ), вы не можете искать или пропускать. Вы загружаете все уведомления каждый раз, когда вы получаете доступ к пользователю.
Вариант второй
Заполнять (как DBRef) объекты
Notification = new Schema ({
message : String,
date : { type : Date, default : Date.now() }
});
UserNotification = new Schema ({
user : { type : Schema.ObjectId, ref : 'User' },
notification : { type : Schema.ObjectId, ref : 'Notification' },
read : { type : Boolean, default : false }
});
User = new Schema( {
username : String,
name : String,
notifications : [ { type : Schema.ObjectID, ref : 'UserNotification' } ]
});
Плюсы:
- Оптимально для запросов
- Нет повторяющихся данных
- Поддержка большого количества уведомлений
Минусы:
- У вас есть 3 коллекции вместо одной (Первый вариант имеет только одну коллекцию)
- У вас есть 3 запроса каждый раз, когда вы обращаетесь к коллекции.
Вопросы
- Какая, по вашему мнению, лучшая схема из этих двух?
- Я что-то упустил или какие-то базовые знания NoSQL?
- Может ли кто-нибудь предложить лучшую схему?
Заранее спасибо и извините за длинный пост, но я думаю, что не смогу объяснить это проще.
notifications
встроенный объект для каждогоUser
документа. в принципе, вам вообще не нужна отдельная модель для уведомлений... Просто создайте объект для пользователя и обновите его, когда должны появиться уведомления. - person Augie Gardner   schedule 26.07.2016