Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中异构表的统一_Mysql_Sql_Database Design - Fatal编程技术网

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

在我的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 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
——这样就不会进行排序。