Я пытаюсь исправить структуру инвентаря, которая должна отображаться на двух или более полях, и я нахожусь в тупике на лучший подход.
Моя структура не очень важна, потому что я могу воссоздать какнеобходимо.Первоначальная версия не была нормализована и содержала только две таблицы.Части продаются в одной таблице.Обязательные для заполнения поля: SKU, MPN, Brand, Cost Поставщик инвентаря в другом.Обязательные поля: SKU, MPN, Торговая марка, Поставщик, Склад, Стоимость
SKU и MPN могут не совпадать с запчастями. SKU - это SKU и поставщик магазина. SKU - это SKU поставщика.MPN является MPN бренда, но в некоторых ситуациях один поставщик может использовать sku бренда для MPN, а другой - MPN бренда.Вот где проблема вступает в игру с нормализованными таблицами.
Нормализованные таблицы, которые я пытался разделить, Поставщики и Склад со связанными идентификаторами.Такой запрос работает, как ожидалось, и выполняется с разумной скоростью:
SELECT * FROM parts p
JOIN warehouse w ON w.id = p.warehouse
JOIN supplier s ON s.id = w.supplier
JOIN inventory i ON i.brand = p.brand AND i.mpn = p.mpn
. Он имеет индекс для p.mpn и выполняется как ожидалось.Тот же код, заменив p.mpn на p.sku, вернет другие совпадающие части.При попытке собрать их вместе, заменив AND i.mpn =
на AND (i.mpn = p.mpn OR i.mpn = p.sku)
, запрос не использует ни один из индексов и выполняется настолько медленно, что никогда не завершается (я позволил ему выполнить в течение ~ 2 минут, прежде чем отменить его)
Чтобы решить эту проблему, я попытался продублировать вышеуказанный запрос с помощью UNION;Это решает проблему производительности в основном, так как запрос выполняется ~ 2 секунды.(Тем не менее, каждый из них запускает ~ 0,01 секунды)
Итак, мой вопрос таков: есть ли способ JOIN on X = Y OR X = Z
при использовании индексов для поддержания скорости?Если нет, я должен просто вернуться к таблицам, которые не нормализованы?(Это повредит при разработке HTML-интерфейса для отдела обслуживания клиентов для просмотра и изменения данных) Или у вас есть предложение о способе структурирования базы данных MySQL для удовлетворения требований соответствия информации поставщика для хранения информации, когдаразные поставщики используют разные MPN для представления одного и того же?Например, один бренд имеет числовой код SKU 123
и буквенно-цифровой MPN ABC
.Один поставщик использует MPN 123
, а другой - MPN ABC
.Для сопоставления магазина используются SKU 123
и MPN ABC
. На данный момент используются только два возможных значения, но существует вероятность того, что третий поставщик может использовать для сопоставления только UPC, и мне нужно добавить, чтокак третье условие.Поэтому необходимо что-то, что поддерживает несколько возможных значений соответствия.Моя попытка использовать UNION была бы громоздкой и даже более медленной, поскольку запрос дублируется для каждого возможного условия соответствия.
Я уверен, что есть несколько способов справиться с этим, поэтому любые предложения будут высоко оценены.