Как спроектировать базу данных товаров с кросс-номерами?
База данных для интернет-магазина автозапчастей, использую EF Core, ASP NET Core и SQL Server.
На сервер будет загружаться определенное количество прайс-листов 1 раз в день. В прайс-листах могут быть одинаковые товары, но не во всех прайс-листах для товаров будут указаны кросс-номера. Прайс-лист это список товаров на определённом складе, в базе данных должны быть по листу такие столбцы:
Бренд
Наименование
Артикул
Цена
Количество
Номер склада
Кросс-номера(Некоторое количество строк через точку с запятой, для поиска взаимозаменяемых товаров)
Изначально я сделал одну таблицу, кросс-номера каждого товара загружались в одну ячейку без разбития на атомарные значения. Соответственно на сайте для поиска аналогов товара нужно обратиться к базе данных, найти все строки совпадающие с этим товаров по "Бренд+Артикул", собрать все кросс-номера в этих строках, потом снова найти совпадения с каждым из полученных кросс-номеров и вернуть аналоги.
Я подумал, что можно синхронизировать все кросс-номера после загрузки новых прайс-листов, т.е брать каждый товар, находить аналогичный товар по "Бренд+Артикул",совмещать их кросс-номера в строку, убирать повторения, и двум товарам присваивать эту строку. Решение настолько медленное, что процесс на весь день.
Далее в поисках проблемы думал про нормализацию и это показалось мне решением, ибо думал я лишь о эффективности поиска. Из таблицы товаров удалил столбец кросс-номеров, создал отдельную таблицу CrossNumbers, в ней три столбца - Бренд, Артикул, Кросс-номер(1 значение) каждая строка должна быть уникальна(иначе количество строк в таблице увеличится в разы). В итоге при загрузке для каждого кросс-номера нужно так же проверять нет ли такой же строки в БД(по 3 значениям Бренд+Артикул+Кросс-номер). Поиск то я сделал эффективным, но теперь прайс-листы будут весь день загружаться) Теперь я в тупике.
Извиняюсь если много лишнего текста.
Ответы (1 шт):
- Я бы добавил в прайс индексированный ItemId=Бренд+Артикул.
- Кроссномер в прайсе оставил, как написано в начале.
- В CrossNumbers объединил Бренд и Артикул в ItemId.
Если что-то тормозит, то нужно смотреть код.