统一MySQL中的异构表

时间:2012-06-09 12:30:34

标签: mysql sql database-design

在我的MySQL数据库中,我有一个products的表格

id | type | name | weight | base_price | [...]

其中id是主键,typeENUM('personal','industrial')。个人和工业产品都有一些存储在products_personalproducts_industrial表格中的附加信息。两者都是

的形式
pid | additional info [...]

其中pid使用products.id进行外键操作,products_personalproducts_industrial的其他信息不同。在我的表格中,我有两个功能(通过CREATE FUNCTION),PRICE_PERSONAL(...)PRICE_INDUSTRIAL(...)。这些函数使用base_price和一些其他信息来计算最终价格。

我希望为我的所有产品创建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

但这很笨重,似乎导致ORDER BY效果不佳(因为它需要对未编入索引的UNION结果进行排序)。

是否有更干净的表或查询结构来完成此类查询?

1 个答案:

答案 0 :(得分:0)

实际上没有测试它,但尝试这样的事情:

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'

想法是通过过滤products.type来尽早切断“错误”的行。另外,我应该赞扬@ypercube发现UNION ALL

ORDER BY下的字段是什么?它们应该被编入索引。