Labutin
@Labutin
Web-разработчик

Какой выбрать ключ шардирования в MongoDB?

Хочу хранить в Монге прайсы.
Значимые колонки:
- ID прайслиста (около 3000 разных прайсов, будет медленно расти. Примерно на 20-30 в месяц)
- ID производителя (около 4000 разных производителей)
- артикул (строка)
- цена
- количество
- наименование

Важные замечания:
В базе будет порядка 100 миллионов строк.
Прайсы могут быть от 100 строк до нескольких миллионов.
Товар - это уникальная комбинация ID бренда + артикул. Уникальных товаров будет около 15-20 миллионов. Т.о. один и тот же товар может повторяться в разных прайсах.
Количество товаров одного бренда может быть от 1000 до несколько миллионов.

Типовой запрос в базу:
Дай список предложений (строк из прайсов) по такому-то списоку товаров.
Т.е. на вход подается N товаров, на выходе все строки, где эти товары есть, т.е. в каких прайс листах по каким ценам и какое количество.

Теперь про шардинг.
Основные требования: главное, чтобы быстро читалось. Скорость записи на втором месте.

Теперь мои мысли.
Т.к. в запрос могут приходить товары 1-2 брендов, то хотелось бы, чтобы запрос пошел только на один шард. Это наводит на мысль шардировать по ID бренда. Но при этом возникает сложность с размером чанков. Как я выше написал, есть бренды с несколькими миллионами позиций (артикулов). Чанк не может содержать меньше, чем все документы с одним конкретным ID производителя. Если не задирать размер чанка в монге, то монга начинает ругаться, что не может перемещать чанки, размер которых больше максимального размера чанка (а оно так и будет).
Если размер чанка задрать, то один станут большими и данные по шардам будут распределены неравномерно.

Если использовать Compound Shard Key, например, ID производителя + артикул, то запрос по N товарам одного бренда вполне может пойти во все шарды, чего хотелось бы избежать.

Собственно вопрос - что посоветуете сделать в моей ситуации?
  • Вопрос задан
  • 935 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lega
Т.е. на вход подается N товаров

товар == артикул?
Т.к. скорость записи не так важна, то можно рассмотреть такой вариант - "схлопнуть" все данные по товару, т.е. один артикул содержит список прайсов+производителей где он участвует. Шардить по артиклу.
+ экономия памяти - кол-во документов в 5 раз меньше, артикул (и наименование) общие.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы