我有一个 MySQL 数据库,其中包含一个产品表和一个包含这些产品的购买/销售历史记录的表。每个产品的买卖历史基本上都记录在这个历史表中。
我正在寻找最有效的方法来创建这些产品的列表,并加入历史表中最早的交易数据。
目前,我的 SQL 查询选择具有最早历史条目的产品,如下所示:
SELECT p.*
, h.transdate
, h.sale_price
FROM products p
LEFT
JOIN
( SELECT MIN(transdate) transdate
, product_id
FROM history
GROUP
BY product_id
) hist_min
ON hist_min.product_id = p.id
LEFT
JOIN history h
ON h.product_id = hist_min.product_id
AND h.transdate = hist_min.transdate
由于此查询使用非常频繁,并且可能与许多产品一起使用,因此我正在考虑将第一个 sale_price 直接存储在“产品”表中。这样我就根本不需要 2 个额外的 JOINS 了。但这意味着我存储冗余数据。
对我来说,最重要的问题是,这些可能性中哪一种是最有效的。
我不确定我是否可以另外问这个问题,但如果有更好的方法我想知道。
编辑:为了澄清“高效”,我正在谈论数以万计的产品,每个产品可能有 10 条历史记录,其中我只选择带有 LIMIT 语句的逐页 20 条。为了保存产品的原始价格,需要将数据直接与记录一起提取,而扫描历史表中的最早时间的日期并再次扫描以加入实际的数据行肯定需要更多的资源,即使只是对于涉及的第二个表。不过,使用主键 ID 或基于 Product_id 和 transdate 的索引肯定会加快第二次连接的速度。
最佳答案
您所描述的称为“标准化”。标准化程度不是非黑即白的区域,因此我认为这个网站不是获得答案的地方,因为它主要基于意见。
查看这些链接以开始使用:
Database Normalization Explained in Simple English
Wikipedia (查看“另请参阅”部分,它描述了标准化级别)
关于mysql - 寻找产品的最早历史条目我应该加入历史/产品表还是在产品表中存储值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718888/