2010-09-14 3 views
2

Есть продукты с наименованием и ценой.Как бы вы моделировали это в MongoDB?

Пользователи регистрировались о товарах, которые они купили.

# option 1: embed logs 
product = { id, name, price } 
user = { id, 
     name, 
     logs : [{ product_id_1, quantity, datetime, comment }, 
       { product_id_2, quantity, datetime, comment }, 
       ... , 
       { product_id_n, quantity, datetime, comment }] 
} 

Мне это нравится. Но если идентификаторы продуктов имеют длину 12 байтов, количество и дата-время - это 32-разрядные (4 байта) целые числа и комментарии в среднем по 100 байт, тогда размер одного журнала равен 12 + 4 + 4 + 100 = 120 байт. Максимальный размер документа - 4 МБ, поэтому максимальное количество журналов на пользователя составляет 4 МБ/120 байт = 33,333. Если предположить, что пользователь регистрирует 10 покупок в день, то предел 4 МБ достигается в 33 333/10 = 3,333 дня ~ 9 лет. Ну, 9 лет, наверное, хорошо, но что, если нам нужно было хранить еще больше данных? Что делать, если пользователь регистрирует 100 покупок в день?

Какой здесь вариант? Должен ли я нормализовать это полностью?

# option 2: normalized 
product = { id, name, price } 
log = { id, user_id, product_id, quantity, datetime, comment } 
user = { id, name } 

Мех. Мы вернулись к реляционным.

+0

Зачем вам нужен 12 байт для продукта ID? Может быть, вы можете использовать 32-битную (или менее) последовательность? – diederikh

+0

Вы также можете переместить комментарии в отдельную коллекцию и ссылаться на комментарии по id. – diederikh

+0

О, хорошо .. так вручную генерировать идентификаторы путем автоматического увеличения? Где бы вы сохранили последнее присвоенное значение id? – randomguy

ответ

0

Да, вариант 2 - ваш лучший выбор. Да, вы вернулись к реляционной модели, но тогда ваши данные лучше всего моделируются именно так. Я не вижу особого недостатка в варианте 2, его данные, которые требуют от вас идти таким образом, а не плохой процесс проектирования.

3

Если размер является основной проблемой, вы можете перейти к варианту 2 с монго DbRef.

 logs : [{ product_id_1, quantity, datetime, comment }, 
      { product_id_2, quantity, datetime, comment }, 
      ... , 
      { product_id_n, quantity, datetime, comment }] 

и вставлять эти журналы внутри пользователя с помощью Dbref, что-то вроде

 var log = {product_id: "xxx", quantity:"2", comment:"something"} 
     db.logs.save(log) 
     var user= { id:"xx" name : 'Joe', logs : [ new DBRef('logs ', log._id) ] } 
     db.users.save(user) 
Смежные вопросы