Мне было интересно, какова наилучшая схема для сценария пользователя/уведомлений, подобного следующему:
- У вас есть несколько пользователей.
- У вас есть несколько уведомлений, которые могут быть для одного пользователя, для некоторых пользователей или для всех пользователей.
- Вам нужна запись уведомления «прочитано» в хранилище, чтобы знать, прочитал ли пользователь уведомление или нет.
Первый вариант
Встроенная схема уведомлений
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?
- Кто-нибудь может предложить лучшую схему?
Заранее спасибо и извините за длинное сообщение, но я думаю, что не смогу объяснить это проще.
задан drinchev 1 April 2012 в 15:19
поделиться