@Kirill-Gorelov
С ума с IT

Сопоставление товаров в БД?

Разрабатываем скрипт по сопоставлению товаров внутри своего магазина.
Само сопоставление не проблема, у нас есть все характеристики, вопрос, в том как хранить сами связи между товарами?
Первое что приходит на ум - это связь многие ко многим. Но что-то подсказывает, что не подойдет. Особенно когда товаров будет очень много. Предположим товарная позиция разрастется до 1млн товаров вместе со всеми SKU и такая связь будет очень неудобной для работы.
И собственно вопрос, может можно еще как-то это сделать? Смотрели в сторону графовых БД, но пока не уверены.....
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
@WaterSmith
Android-разработчик. Java, Kotlin

сопоставление - похожие товары
Товарная позиция, товар, элемент номенклатуры и SKU - для меня это так же одно и тоже...

Бизнес задача, нужно от разных поставщиков показывать походие товары по свойствам, категориям и параметрам.

В этом случае, я бы ввел таблицы этих свойств и категорий, и затем делал бы выборку товаров по связи с этой таблицей.
Например, таблицы:
Типы категорий (cattypes): id, name
Категории (categories): id, type_id, name
Принадлежность товаров к категориям (product_categories): sku_id, kat_id
Теперь, допустим у нас есть тип категории "Инструмент". У него есть категории: "Отвертки", "Пассатижи", "Молотки".
И допустим есть тип категори "Виды отверток", с категориями: "крестовая", "звездочка", "шлицевая".
В таблицу product_categories вы делаете записи по каждому товару и каждой категории, для крестовых отвертки это будет две записи, "Отвертки" и "крестовая". (нужно больше признаков, просто добавляете новые типы и значения категорий).
В результате у вас в этой таблице product_categories будет столько записей, сколько у вас категорий по каждому товару. Для какого-то товара 5 записей, для какого-то одна, ну допустим в среднем 5 записей. Тогда размер этой таблицы будет КоличествоТоваров * 5
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@immelnikoff
Изучаю БД
Как я понял, под сопоставлением товаров понимается связь типа "Вместе с товаром A в x% случаев покупают товар B". Если так, то такое "сопоставление" изображается направленным взвешенным и достаточно разреженным (если в случае веса дуги 0% считать, что она отсутствует) графом.
Почему вы считаете, что таблица N:M будет неудобна для хранения такой структуры?
id_first (4 байта)
id_second (4 байта)
conn_rate (1 байт)
period_type (1 байт) -- день, неделя, месяц
date (2 байта) -- дата начала периода

Далее, делаем индекс B-tree по полям id_first и id_second .
Пусть, товаров 100 000. Для хранения всех связей за конкретный период понадобится 100 000 * 99 999 ≈ 10 млрд. строк или 90 ГБайт места + примерно столько же для индекса ≈180 ГБайт.
А периодов за 1 год = 365 + 52 + 12 = 429. Итого, для хранения годичных данных понадобится ≈ 77 ТБайт.
Понятно, что это нереализуемо.
Тогда придётся хранить дуги с достаточно большим весом. От этого вряд ли вы что-то потеряете, так как ~ 99-99.99% дуг будут иметь вес x < 0.1%.
А ещё можно оптимизировать требуемый объем, разделив данную табличку на 3: табличка для дневных данных, табличка для недельных и табличка для месячных.
Ответ написан
Ваш ответ на вопрос

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

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