Предложения схемы уведомлений пользователя Mongoose/MongoDB

Мне было интересно, какова наилучшая схема для сценария пользователя/уведомлений, подобного следующему:

  • У вас есть несколько пользователей.
  • У вас есть несколько уведомлений, которые могут быть для одного пользователя, для некоторых пользователей или для всех пользователей.
  • Вам нужна запись уведомления «прочитано» в хранилище, чтобы знать, прочитал ли пользователь уведомление или нет.

Первый вариант

Встроенная схема уведомлений

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 запроса каждый раз, когда вы обращаетесь к коллекции.

Вопросы

  1. Как вы думаете, какая из этих двух схем лучшая?
  2. Я что-то упустил или какие-то базовые знания NoSQL?
  3. Кто-нибудь может предложить лучшую схему?

Заранее спасибо и извините за длинное сообщение, но я думаю, что не смогу объяснить это проще.

16
задан drinchev 1 April 2012 в 15:19
поделиться