寻找产品最早的历史记录应该加入历史/产品表或将产品价值存储在产品表中?

问题描述:

我有一个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语句选择pageical 20。为了保存产品的原始价格,需要将数据直接记录下来,而在历史记录表中扫描最早时间的日期和另一次扫描以加入实际的数据行将需要更多的资源,即使只有对于涉及的第二张表格。使用主键ID或索引而不是product_id和transdate会使第二次连接加速。

+1

我会说,直到你遇到问题坚持你拥有的东西。 – Strawberry

+0

“高效”意味着什么? (答案:没有。)从教科书中学习信息建模和数据库设计的原理。当你知道有什么选择和成本时,你可以开始告诉人们你想如何交易。 – philipxy

您所描述的内容称为“规范化”。规范化程度不是黑白区域,所以我不认为这个网站是获得答案的地方,因为它主要是基于意见的。

点击这些链接即可开始使用:

Database Normalization Explained in Simple English

Wikipedia(检查出的“又见”部分,它描述了规范化的水平)

+1

“简单”链接太模糊,错误,无用。维基中没有文章告诉你*如何规范化*。并且通过移动通过较低的NFs来完成对NF的正常化。人们应该阅读并遵循教科书。 – philipxy

+0

Tbh我没有仔细阅读,你完全正确。我会编辑我的答案以反映这一点。 – tmwoods

+0

没关系,以为你可以做删除线。编辑它是一个警察,所以我会离开它。 – tmwoods