我正在尝试修复一个必须由两个或多个字段Map的库存结构,而我在最佳方法上遇到了难题。
我的结构不是很重要,因为我可以根据需要重新创建。原始版本没有规范化,只包含两个表。一张table里卖的零件。必填字段:sku、mpn、brand、cost其他字段中的供应商库存。必填字段: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.sku替换p.mpn将返回其他匹配的零件。当试图通过替换 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前端以查看和修改数据时会造成伤害)或者,当不同的供应商使用不同的mpn来表示同一个mpn时,您是否建议如何构造一个mysql数据库来处理匹配供应商信息以存储信息的要求?例如,一个品牌有一个数字sku 123
和一个字母数字mpn ABC
. 一家供应商使用mpn 123
,而另一个使用mpn ABC
. 为了使商店匹配,它使用sku 123
和mpn ABC
现在,只使用了两个可能的值,但是有可能第三个供应商可能只使用upc来匹配,我需要添加这一点作为第三个条件。所以需要支持多个可能匹配值的东西。我尝试使用union会很麻烦,甚至更慢,因为查询会针对每个可能的匹配条件进行复制。
我相信有多种方法来处理这个问题,所以任何建议都将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!