Есть продукты с наименованием и ценой.Как бы вы моделировали это в 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 }
Мех. Мы вернулись к реляционным.
Зачем вам нужен 12 байт для продукта ID? Может быть, вы можете использовать 32-битную (или менее) последовательность? – diederikh
Вы также можете переместить комментарии в отдельную коллекцию и ссылаться на комментарии по id. – diederikh
О, хорошо .. так вручную генерировать идентификаторы путем автоматического увеличения? Где бы вы сохранили последнее присвоенное значение id? – randomguy