我建立公交车的数据库仓库库存。该公司将购买更多的公交车随着时间的推移,这些采购计划,并为这些巴士行有前途购买日期。一些公交车目前在库存已按计划容纳人数增加。有没有办法有在这取决于日期数据库中的价值?
例如,如果我在2019-03-04
库存查询公交车,Bus13
将在座位35
,但如果我查询2020-01-01
,Bus13
将有37
在座位。
任何帮助或指导,将不胜感激。
谢谢!
这就是所谓的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
);
当您插入新行,你需要“关闭”之前的行并添加一个新的。这通常是在存储过程中或在应用程序逻辑来完成。
该Answer by Linoff是正确的,但对于一个反规范化的数据仓库。
在规范化的关系数据库,你就必须有一个bus
表儿童capacity
父表。该capacity
将有一个开始和截止日期,全值不与同级行对同一母公司重叠。 SQL使得此没有规定,所以你的应用逻辑或存储过程必须执行日期范围(抵接,不重叠,无缺口)的整洁。
如果你想知道一个总线的能力,你必须指定一个日期,然后做一个跨越两个表的连接。
没有能力行总线将意味着它是全新的,尚未部署到舰队。一旦部署,总线总是有在capacity
表中至少有一行。
有关最新的记录,为当前有效的能力,我们必须决定怎样做停止日期。有些人可能会提出一个null
,但我可以推荐Chris Date的回避,每当有null
同意。我会选择在未来的某个特定日期的占位符。但不太远的一些数据库或软件库可能会受到限制。
作为托尔斯滕KETTNER这个答案评论,在技术上对capacity
表的截止日期列是多余的,如果您的日期范围邻接代码是正确的,完整的可以省略。