2011-01-27 87 views
3

基本上,我的问题是 - 我有一个价格清单,其中一些是历史的(即我希望能够在3月11日搜索该产品X为0.99美元,4月1日为1.99美元等)。什么是存储这些信息的最佳方式?在MySQL表中存储历史价格表的最佳方式是什么?

我想我可能会有一个产品表,有一个外键到价格表。我最初认为存储当前价格可能是最好的选择,但我认为我希望能够存储历史价格数据,那么更好的途径是存储类似以下价格表的表格:

CREATE TABLE prices (
     id BIGINT auto_increment not null, 
     primary key (id), 
     price DECIMAL(4,2) not null, 
     effectiveStartDate DATETIME NOT NULL, 
     effectiveEndDate DATETIME 
); 

我在这里有点亏了。我希望能够高效地搜索产品并查看产品价格随时间变化的情况。我如何有效地将一组这些价格与产品相关联?我想我所问的是'为了能够提供跨越特定日期的查询的高效搜索,将这个索引编制成最佳方式是什么?'

+0

您是否真的想看到历史价格或知道订单时产品的价格。我看不到为什么我需要看到这部分是2008年的12美元,现在是17美元。 – HLGEM 2011-01-27 23:08:06

+0

我会用product_id替换id,并考虑将主键设置为product_id,price和effectivestartdate。 – 2011-01-27 23:09:28

回答

9

将需要的历史数据与当前价格分开。这意味着:

1)将当前价格保留在产品表中。

2)当价格变化时,只将新价格插入历史表中,仅包含开始日期。你并不需要结束日期,因为你可以从前一行中得到它。 (您仍然可以放入它,这使得查询更容易)

还请记住,您的订单历史记录提供了另一种历史记录,即以一定的价格随时间推移的实际购买量。

4

首先,请确保你真的需要这样做。您是否将订单存储在同一个数据库中?如果是这样,您可以随时查看订单中物料的价格,随时查看历史价格趋势。这也将使您能够在价格变化和订购模式的变化之间进行关联;唯一不会解决的情况是价格变化导致没有订单被放置。

这就是说,如果你想要一个独立的价格变化记录,你呈现的是好的。我建议的唯一的事情是消除结束日期;除非您计划在产品有价格或重叠价格的时间上存在差距,否则开始日期已足够,并且会使您的逻辑更加轻松。

1

结束日期可能适用于更复杂的系统,您可以在此计划产品价格(即各种季节性促销等)。 (哦,这是BS,应该更多地考虑它......好吧,只有当你同时计划多个产品价格时,你才需要结束日期,通过别的方式来区分......仍然通常很方便当前的记录,而不是看前一个/下一个)

实际上,对于大多数复杂系统而言,仅有几个当前价格仅通过“尺寸”进行区分(例如,某种属性可能由实际运输地点决定或客户所在的国家等)

在您省略[product_id,starting_date,..?。的自定义“id”主键之前,我还会检查两次您的平台/语言/框架/工作风格。 。]复合PK。后者是更合乎逻辑的选择(至少我个人更喜欢它),但它有时可能适得其反,例如,如果您的数据库库只能使用更复杂的主键的方法有限。

相关问题