我正在建立仓库库存中的公共汽车数据库。该公司将随着时间的推移购买更多的公交车,这些采购已经计划好,这些公交车的行有一个未来的购买日期。当前库存中的某些公交车计划增加座位容量。有没有一种方法可以在数据库中具有依赖于日期的值?
例如,如果我查询2019-03-04
上库存中的公共汽车,Bus13
的座位数将为35
,但是如果我查询2020-01-01
,则{{1 }}的座位数为Bus13
。
任何帮助或指导将不胜感激。
谢谢!
答案 0 :(得分:2)
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
);
插入新行时,需要“关闭”上一行并添加新行。这通常是在存储过程或应用程序逻辑中完成的。