给定两个日期范围,确定两个日期范围是否重叠的最简单或最有效的方法是什么?
举个例子,假设我们有通过日期时间变量表示的范围StartDate1来EndDate1 和 StartDate2到EndDate2.
关于在数据库中对数据进行版本控制,我已经阅读了关于SO的一些问题(比如这一个).
我喜欢上面提到的一些建议.我有最长的时间想要(需要)修改我的许多桌子,但从来没有绕过它.作为一个只有简单的数据库工作的程序员,我想知道如何才能真正做到这一点.
我不是要求SQL语法中的实际解决方案.我最终可以为自己解决这个问题(或者在时机成熟时发布).我只是要求人们评论他们将如何进行评论以及如果我要"修改"数亿条记录,可能会出现任何潜在的性能问题.或者任何其他建议,只要它基于以下示例.
举个简单的例子:
Person
------------------------------------------------
ID UINT NOT NULL,
PersonID UINT NOT NULL,
Name VARCHAR(200) NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL
Audit
------------------------------------------------
ID UINT NOT NULL,
UserID UINT NOT NULL, -- Who
TableName VARCHAR(50) NOT NULL, -- What
OldRecID UINT NOT NULL, -- Where
NewRecID UINT NOT NULL,
AffectedOn DATE NOT NULL, -- When
Comment VARCHAR(500) NOT NULL -- Why
Run Code Online (Sandbox Code Playgroud)
如果TableName是一个字符串,我不确定如何将Audit表链接到任何其他表(例如Person)?
另外,假设我有三个GUI来填充:
要完成1和2,查询Person表或Audit表会更好吗?
要完成3,所谓的数据库专家是否只需获取所有记录并将其传递给软件进行处理,或按PersonID和受影响日期分组?这通常是在一个查询中处理还是多个?
我正在阅读有关时态数据库的内容,看起来它们已经建立了时间方面.我想知道为什么我们需要这样的模型?
它与普通的RDBMS有何不同?我们不能有一个普通的数据库,即RDBMS,并说有一个触发器,它将时间戳与发生的每个事务相关联吗?可能会有性能损失.但我仍然对在市场上具有强大案例的时态数据库持怀疑态度.
目前的任何数据库都支持这样的功能吗?
我需要一个可以在一个维度内存储非重叠范围的数据结构.不需要完全覆盖整个尺寸范围.
一个例子是会议室调度程序.维度是时间.没有两个时间表可能重叠.会议室并非始终安排.换句话说,对于给定时间,最多可以有一个时间表.
快速解决方案是存储开始和结束时间的范围.
Range {
Date start
Date end
}
Run Code Online (Sandbox Code Playgroud)
这是非规范化的,要求容器不强制执行.对于两个相邻的范围,前一个'结束将在下一个开始时是多余的.
另一种方案可能涉及存储每个范围的一个边界值.但是对于连续的范围序列,总会有一个边界值而不是范围.为了解决这个问题,序列可以表示为交替的边界值和范围:
B =边界值,r =范围
BrBrB
数据结构可能如下所示:
Boundary {
Date value
Range prev
Range next
}
Range {
Boundary start
Boundary end
}
Run Code Online (Sandbox Code Playgroud)
从本质上讲,它是具有交替类型的双向链表.
最终,我使用的任何数据结构都将在内存(应用程序代码)和关系数据库中表示.
我很好奇学术界或行业所尝试的解决方案是什么.
大家认为什么是SQL中有时间限制的层次结构的最佳表示?
我的意思是:
- 在任何给定的日期,你有一个普通的树层次结构
- 这个层次结构可以从一天到
另一个变化- 每个孩子在任何给定的日期仍然只有一个父
第1天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
| |-Doc(*)
|
|-Moe
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
第2天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
|
|-Moe
|-Doc(*)
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
孩子可以在任何时候第一次加入层次结构,或者完全离开层次结构.(例如,新员工和退休员工.)
主要考虑因素:
我知道我现在是怎么做的,但我对其他人怎么做可能很感兴趣:)
编辑
我天真地假设了一些考虑,所以会更明确......
通用性质是最重要的(仅形成通用关系模式的一部分),结合易于使用的驱动报告(对于任何日期范围的树的任何部分)以及可靠更新的能力.