以下是理想的设计?
目前的燃料价格 折扣价(不固定,与当前价格一起发布) 每种燃料的历史价格(用于绘图/历史查询)
我的想法是:
Product_table
CURRENT_PRICE
History_price
通过网络抓取/解析数据源来填充数据。
Current_price& history_price看起来完全一样,是否应该将确定current_price的逻辑卸载到应用程序层?
答案 0 :(得分:0)
你已经有了自己的设计。但不是两个价格表 - 只有一个。查看将在特定时间返回特定产品的数据和历史价格的查询结构:
select p.ID, p.Name, p.Brand, pr.SitePrice, pr.DiscountedPrice
from Products p
join Prices pr
on pr.ProductID = p.ID
and pr.EffDate =(
select Max( pr1.EffDate )
from Prices pr1
where pr1.ProductID = pr.ProductID
and pr1.EffDate <= :DateOfInterest )
where p.ID = :ProductOfInterest;
这将返回一行输出,其中包含产品信息(:ProductOfInterest)和在指定时间生效的价格信息(:DateOfInterest)。但是,如果将当前日期时间值放入:DateOfInterest,则会返回当前价格信息。
因此,您可以将所有价格(过去和现在)放在一个表格中,并使用相同的查询查询历史和当前数据。实际上,删除where
子句并将当前时间戳硬编码到视图中,现在您有一个只返回当前价格的数据源。
create view CurrentPrices as
select p.ID, p.Name, p.Brand, pr.SitePrice, pr.DiscountedPrice
from Products p
join Prices pr
on pr.ProductID = p.ID
and pr.EffDate =(
select Max( pr1.EffDate )
from Prices pr1
where pr1.ProductID = pr.ProductID
and pr1.EffDate <= Now()
);
现在,您对特定产品的当前价格信息的查询更简单:
select *
from CurrentPrices
where ID = :ProductOfInterest;
目前,我们无法将参数传递到视图中,因此无法使用该视图及时回顾。但是当你看到你能得到什么时,这并不是一个特别大的劣势。但是,您可以创建一个匹配所有价格的视图来显示价格历史记录:
create view HistoricPrices as
select p.ID, p.Name, p.Brand, hp.SitePrice, hp.DiscountedPrice, pr.EffDate
from Products p
join Prices pr
on pr.ProductID = p.ID;
对于此查询,您当然希望公开生效日期。然后查询以获取产品的完整价格历史记录:
select *
from HistoricPrices
where ID = :ProductOfInterest
order by EffDate;