用SQL表示数据约束
用SQL表示数据约束,sql,Sql,我正在为我妻子写一份日程安排申请,我遇到了以下问题
我有一个可以用ActiveRecord术语描述的模式:
每个资源都有并属于许多事件
每个事件都有并属于许多资源,并且有许多时间跨度
每个timespan都属于一个事件,并具有三个属性:天、开始时间和结束时间
我想对我的数据设置以下约束:
A. For each timespan, timespan.start-time ≤ timespan.end-time
B. For each event, for each t_a, t
我正在为我妻子写一份日程安排申请,我遇到了以下问题
我有一个可以用ActiveRecord术语描述的模式:
- 每个资源都有并属于许多事件
- 每个事件都有并属于许多资源,并且有许多时间跨度
- 每个timespan都属于一个事件,并具有三个属性:天、开始时间和结束时间
我想对我的数据设置以下约束:
A. For each timespan, timespan.start-time ≤ timespan.end-time
B. For each event, for each t_a, t_b ∈ TIMESPANS(event),
either t_a = t_b
or t_a.day ≠ t_b.day
or t_a.end-time ≤ t_b.start-time
or t_a.start-time ≥ t_b.end-time
C. For each resource, for each e_a, e_b ∈ EVENTS(resource),
either e_a = e_b
or for each t_a ∈ TIMESPANS(e_a) and t_b ∈ TIMESPANS(e_b),
either t_a.day ≠ t_b.day
or t_a.end-time ≤ t_b.start-time
or t_a.start-time ≥ t_b.end-time
A.对于每个timespan,timespan.start-time≤ timespan.end-time
B.对于每个事件,对于每个t_a,t_B∈ 时间跨度(事件),
t_a=t_b
或者一天一次≠ 托比日
或者t_a.结束时间≤ 开始时间
或者说开始时间≥ 结束时间
C.对于每个资源,对于每个e_a,e_b∈ 事件(资源),
e_a=e_b
或者每一个t_a∈ 时间跨度(e_a)和t_b∈ 时间跨度(e_b),
一天两次≠ 托比日
或者t_a.结束时间≤ 开始时间
或者说开始时间≥ 结束时间
(A) 确保时间跨度的格式正确,(B)确保事件不会自我冲突,(C)确保资源不会过度调度
目前,我正在应用程序层强制执行这些约束,但是,出于自学习的目的,我想知道是否可以将这些约束放在数据库层
有什么方法可以用SQL表达这些约束吗
编辑:
所以我发现我想要的是SQL的CREATE ASSERTION
语句(至少对于那些不能被简单的CHECK
覆盖的语句),但它似乎不像任何支持它的RDBMS()a可以很容易地用timespan表上的CHECK约束表达出来,因为每一行都可以在不检查任何其他行的情况下检查自身的一致性
B和C更复杂,需要从其他表格中读取信息。在这种情况下(至少在SQL Server中),可以使用用户定义的函数(将当前行中的值传递给它)来检查其他表,也可以使用触发器来检查其他表
注意:在编写这样的触发器时,请记住,对于SQL语句,触发器只触发一次。如果该语句INSERT
s或UPDATE
s多行,则INSERTED
表将包含多行,应使用适当的技术(如JOIN
)检查所有行,以匹配域约束
顺便说一句:乔·塞尔科最近有一次关于限制的谈话。你在安排你妻子的日程吗?;-)谢谢这很有帮助。