mysql - 寻找产品的最早历史条目我应该加入历史/产品表还是在产品表中存储值?

标签 mysql sql join relational-database

我有一个 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/

相关文章:

mysql - 从多个具有原点的相同表中选择

java - 是否可以合并四个不同的 MySQL 查询以及中间的 if 条件以避免 java 代码?

mysql - OUTER JOIN MySQL 中的三个不同表时出现的问题

mysql - 使用第二个表作为查找?

mysql - 如何将 Excel 数据导入 MySQL 表?

mysql - 对表中的多个分区进行子分区

PHP购物车安全

sql - Postgresql - 具有相关子查询的条件 SUM

java - 查询语法异常 : Unexpected token *

mysql - 如何格式化查询