MySQL中异构表的统一
在我的MySQL数据库中,我有一个MySQL中异构表的统一,mysql,sql,database-design,Mysql,Sql,Database Design,在我的MySQL数据库中,我有一个产品的表 id | type | name | weight | base_price | [...] 其中,id是主键,type是ENUM('personal','industrial')。个人和工业产品都有一些附加信息存储在products\u Personal和products\u industrial表中。两者都是相同的形式 pid | additional info [...] 其中,pid为外键,带有products.id,products\u
产品的表
id | type | name | weight | base_price | [...]
其中,id
是主键,type
是ENUM('personal','industrial')
。个人和工业产品都有一些附加信息存储在products\u Personal
和products\u industrial
表中。两者都是相同的形式
pid | additional info [...]
其中,pid
为外键,带有products.id
,products\u personal
和products\u industrial
的附加信息不同。在我的表中,我有两个函数(通过CREATE FUNCTION
),PRICE\u PERSONAL(…)
和PRICE\u INDUSTRIAL(…)
。这些函数使用基本价格和一些附加信息来计算最终价格
我希望为我的所有产品创建一个id | type | name |[…]| price
视图。我现在的候选人是
CREATE VIEW foo AS
SELECT id, type, name, [...], PRICE_PERSONAL(params) AS price
FROM products
INNER JOIN products_personal ON products.id = products_personal.pid
UNION
SELECT id, type, name, [...], PRICE_INDUSTRIAL(params) AS price
FROM products
INNER JOIN products_industrial ON products.id = products_industrial.pid
但这是一个庞大的过程,似乎会导致较差的按
排序性能(因为它需要对未索引的联合
结果进行排序)
是否有一个更干净的表或查询结构来完成这种类型的查询?实际上没有测试它,但请尝试以下操作:
CREATE VIEW foo AS
SELECT id, type, name, [...], PRICE_PERSONAL(params) AS price
FROM products
INNER JOIN products_personal ON products.id = products_personal.pid
WHERE type = 'personal'
UNION ALL
SELECT id, type, name, [...], PRICE_INDUSTRIAL(params) AS price
FROM products
INNER JOIN products_industrial ON products.id = products_industrial.pid
WHERE type = 'industrial'
这样做的目的是通过过滤产品,尽早切断“错误”行。键入。此外,我还应该赞扬@ypercube发现了UNION ALL
“排序依据”
下的字段是什么?它们可能应该被编入索引。您可以将其转换为UNION ALL
——这样就不会进行排序。