寻找产品最早的历史记录应该加入历史/产品表或将产品价值存储在产品表中?
问题描述:
我有一个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会使第二次连接加速。
答
您所描述的内容称为“规范化”。规范化程度不是黑白区域,所以我不认为这个网站是获得答案的地方,因为它主要是基于意见的。
点击这些链接即可开始使用:
Database Normalization Explained in Simple English
Wikipedia(检查出的“又见”部分,它描述了规范化的水平)
我会说,直到你遇到问题坚持你拥有的东西。 – Strawberry
“高效”意味着什么? (答案:没有。)从教科书中学习信息建模和数据库设计的原理。当你知道有什么选择和成本时,你可以开始告诉人们你想如何交易。 – philipxy