Как бы вы смоделировали это в MongoDB? - PullRequest
2 голосов
/ 14 сентября 2010

Есть товары с названием и ценой.

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

# 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 = 3333 дня ~ 9 лет.Что ж, 9 лет - это, наверное, хорошо, но что если нам нужно будет хранить еще больше данных?Что делать, если пользователь регистрирует 100 покупок в день?

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

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

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

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

, если основной проблемой является размер, вы можете перейти к варианту 2 с помощью mongo 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)
0 голосов
/ 14 сентября 2010

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

...