SQL值取决于时间

时间:2019-02-04 21:28:41

标签: mysql database-design

我正在建立仓库库存中的公共汽车数据库。该公司将随着时间的推移购买更多的公交车,这些采购已经计划好,这些公交车的行有一个未来的购买日期。当前库存中的某些公交车计划增加座位容量。有没有一种方法可以在数据库中具有依赖于日期的值?

例如,如果我查询2019-03-04上库存中的公共汽车,Bus13的座位数将为35,但是如果我查询2020-01-01,则{{1 }}的座位数为Bus13

任何帮助或指导将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

[总线]-| --- 0 <[容量]

Answer by Linoff是正确的,但适用于非规范化数据仓库。

在规范化的关系数据库中,您将有一个bus表父表,在capacity表中有子表。 capacity的开始日期和结束日期,整个值不会与同一父级的同级行重叠。 SQL对此不作任何规定,因此您的应用程序逻辑或存储过程必须强制日期范围的整齐(邻接,不重叠,没有间隔)。

当您想知道公共汽车的容量时,必须指定一个日期,然后在两个表之间进行联接。

没有容量行的公共汽车意味着它是全新的,尚未部署到车队。部署后,总线在capacity表中始终至少有一行。

对于最新记录,对于当前有效的容量,我们必须决定如何处理停止日期。有人可能会建议使用null,但我同意Chris Date,建议尽可能避免使用null。我会选择将来的特定日期作为占位符。但不是,因为某些数据库或软件库可能受到限制。

正如Thorsten Kettner在此答案上评论的那样,从技术上来说,capacity表上的Stop date列是多余的,如果您的日期范围基台代码正确且完整,则可以省略。

答案 1 :(得分:1)

这称为Type 2 Dimension。它基本上是具有生效日期和结束日期的行。例如:

create table busses (
    bus_id int auto_increment primary key,
    capacity int not null,
    eff_date datetime,
    end_date datetime,
    created_at datetime
);

插入新行时,需要“关闭”上一行并添加新行。这通常是在存储过程或应用程序逻辑中完成的。