Мне было интересно, какая наилучшая схема для типа пользователя/уведомлений выглядит следующим образом:
- У вас несколько пользователей.
- У вас есть несколько уведомлений, которые могут быть для одного пользователя, для некоторых пользователей или для всех пользователей.
- Вам нужна запись "читать" в хранилище, чтобы узнать, прочитал ли пользователь уведомление или нет.
Вариант 1
Схема встроенных уведомлений
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), вы не можете выполнить поиск или пропустить. Вы загружаете каждое уведомление каждый раз, когда получаете доступ к пользователю.
Вариант второй
Объекты Populate (DBRef like)
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 коллекции, а не одна ( Вариант 1 имеет только одну коллекцию)
- У вас есть 3 запроса при каждом доступе к коллекции.
Вопросы
- Как вы думаете, самая лучшая схема из этих двух?
- Я пропустил что-то или какое-то базовое знание NoSQL?
- Может ли кто-нибудь предложить лучшую схему?
Спасибо, заранее, и я прошу прощения за длинный пост, но я думаю, что я не могу объяснить это проще.