mysql - MySQL索引表连接多列
问题描述
我正在尝试修复必须按两个或多个字段映射的库存结构,但我对最佳方法感到困惑。
我的结构不是很重要,因为我可以根据需要重新创建。原始版本未标准化,仅包含两个表。在一张桌子上出售的零件。必填字段:SKU、MPN、品牌、成本 对方的供应商库存。必填字段:SKU、MPN、品牌、供应商、仓库、成本
SKU和MPN不一定相同,parts.SKU是商店的SKU,supplier.SKU是供应商的SKU。MPN 是品牌的 MPN,但在某些情况下,一个供应商可能使用品牌的 sku 作为 MPN,而另一个供应商将使用品牌的 MPN。这就是规范化表出现问题的地方。
我尝试使用相关 ID 拆分供应商和仓库的规范化表。像这样的查询按预期工作并以合理的速度执行:
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 来代表同一个?例如,一个品牌有一个数字 SKU123
和一个字母数字 MPN ABC
。一家供应商使用 MPN 123
,而另一家则使用 MPN ABC
。为了匹配商店,它使用 SKU123
和 MPNABC
目前,只使用了两个可能的值,但第三个供应商可能只使用 UPC 进行匹配,我需要将其添加为第三个条件。所以需要支持多个可能的匹配值的东西。我尝试使用 UNION 会很麻烦,甚至会更慢,因为每个可能的匹配条件都会重复查询。
我确信有多种方法可以处理这个问题,所以任何建议都将不胜感激。
解决方案
推荐阅读
- php - 选中 Laravel 中的选中复选框
- ios - 领域:如何在迁移期间修复“无效的属性名称”RLMException
- angular7 - 为什么 Ionic Native Device Plugin 在 Ionic 4 中不起作用?
- javascript - chrome.storage.sync.get 无法使用键值对按预期运行
- asp.net-mvc - 使用 razor pages 与 mvc 的正确时机
- vba - 以 X 的 Y 格式将页码添加到 Word 文档的底部
- java - 将 KafkaAvroDeserializer 与 Alpakka 一起使用
- c# - VTest 无法使用代码 1 启动 OWASP ZAP 进程
- c - 无法理解代码行的输出 -
- json - 我应该如何在我的应用程序中获取 Firebase 数据