想象一下有以下架构:
现在,在此架构中,它将拥有 10000 台冰箱、10000 台电视和 10000 台计算机。那么每个备件将有 5000 个。 要获取与计算机相关的所有备件,可以这样查询:
SELECT SP.name, C.name as computer
FROM spare_parts SP, computer_spare_part CSP, computers C
WHERE CSP.spare_parts_id = SP.id
AND CSP.computers_id = C.id
现在,有了给定的备用 ID = 1,人们想要获取详细信息和相关对象(冰箱、电视、计算机)。
SELECT SP.name, F.name as equipment
FROM spare_parts SP, fridge_spare_part FSP, fridges F
WHERE FSP.spare_parts_id = SP.id
AND FSP.fridges_id = F.id
AND SP.id = 1
UNION
SELECT SP.name, C.name as equipment
FROM spare_parts SP, computer_spare_part CSP, computers C
WHERE CSP.spare_parts_id = SP.id
AND CSP.computers_id = C.id
AND SP.id = 1
UNION
SELECT SP.name, T.name as equipment
FROM spare_parts SP, television_spare_part TSP, television T
WHERE TSP.spare_parts_id = SP.id
AND TSP.televisions_id = C.id
AND SP.id = 1
在这种情况下,有 2 个 SELECTS 将失败。想象一下,备用 ID = 1 与计算机相关。冰箱和电视的 SELECT 不会得到任何结果。
这将需要额外的处理时间。
如何优化此查询或架构来解决此类问题?
最佳答案
每种产品及其各自的备件有多个表是个坏主意
hard to code properly or with a framework, harder to maintain, nightmare to query as well.
因此使用具有相同列的主表并相应地拆分它们,因为:
Divides your information into subject-based tables reduce redundant data. Apply the normalization rules to check it implemented correctly.
就您而言,表格应该是
Product (ProductId, ProductName)
ProductDes(ProductId, ProductType)
SpareParts(productid (FK), sparepart_name, brand)
您现在和以后都可以根据要求增强它们,不会出现任何问题。正确索引表不会导致快速处理问题。
关于mysql - SQL schema优化,如何避免union?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466983/