mysql - SQL schema优化,如何避免union?

标签 mysql database-design relational-database schema query-optimization

想象一下有以下架构:

SQL Schema

现在,在此架构中,它将拥有 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/

相关文章:

mysql - SQL查询: How to validate the prerequisite for courses that finished and how to find time conflict of courses?

sql - MySQL引入外键会降低性能吗

sql - Postgres JOIN 实现

ruby-on-rails - Ruby on Rails ActiveRecord 数据流

SQL 服务器 : Listing Differences Between Tables

php - SQL 中的 LIKE 不起作用

php - 获取观看次数(唯一观众和唯一视频)

mysql - 如何跨多列添加多行以根据唯一 ID 获得最终结果?

从数据库检索时php标签数据不执行

mysql - 如何为两个表制作一个共同的自增id