繁体   English   中英

在MySQL表中存储历史价格表的最佳方法是什么?

[英]What is the best way to store a historical price list in a MySQL table?

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

我假设我可能有一个Product表,它有一个价格表的外键。 我最初认为存储当前价格可能是最好的选择,但我认为我希望能够存储历史价格数据,因此更好的路线是如何在价目表中存储如下表格:

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

我在这里有点不知所措。 我希望能够有效地搜索产品,并了解该产品的价格如何随时间而变化。 如何有效地将一组这些价格与产品相关联? 我想我要问的是,'为了能够为跨越特定日期的查询提供有效搜索,最好的方法是将其编入索引?'

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

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

2)当价格变化时,将新价格插入历史表中,仅包含开始日期。 您实际上并不需要结束日期,因为您可以从上一行获取结束日期。 (你仍然可以把它放进去,它使查询更容易)

另请记住,您的订单历史记录提供了另一种历史记录,即在给定价格下实际购买的历史记录。

首先,确保你真的需要这样做。 您是否在同一个数据库中存储订单? 如果是这样,您可以随时通过检查订单中物品的价格来查看历史价格趋势。 这样您还可以在价格变化和订购模式变化之间建立关联; 它不会解决的唯一情况是,如果价格变化导致没有下订单。

话虽这么说,如果你想要一个独立的价格变化记录,你所呈现的是好的。 我唯一建议的是取消结束日期; 除非您计划在产品没有价格或重叠价格的情况下产生时间差,否则开始日期就足够了,这将使您的逻辑变得更容易。

对于更复杂的系统,结束日期可能是可行的,您可以在此系统中计划产品价格(即各种季节性促销/等)。 (哦,这是BS,应该考虑更多...好吧,只有当你同时计划多个产品价格时才需要结束日期,区别于其他东西......仍然通常很方便将它放在里面当前记录,不看上一个/下一个)

实际上,对于大多数复杂系统而言,通过仅仅“尺寸”区分几种当前价格(即某种属性可能由实际运输地点或客户所在国家等决定......)并不罕见。

在省略自定义“id”主键之前,我还会检查你的平台/语言/框架/工作方式的两倍,以支持[product_id,starting_date,..?..] composite pk。 后者在某种程度上更合乎逻辑(至少我个人更喜欢它),但它有时可能会适得其反,例如,如果您的数据库库只有有限的方式来处理更复杂的主键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM