考虑以下设计:
LEGAL_CASE table (columns)
--------------------------------
LEGAL_CASE_ID
APPELLATE_CRT_ID
DISTRICT_CRT_ID
TRIAL_CRT_ID
所有法院都在查询表中定义
COURT table (data)
--------------------------------------------
CRT_ID CRT_TYPE CRT_NAME
--------------------------------------------
1 A APPELLATE COURT 1
2 A APPELLATE COURT 2
3 D DISTRICT COURT 1
4 D DISTRICT COURT 2
5 T TRIAL COURT 1
6 T TRIAL COURT 2
我认为,这样做的标准方法是为每种球场类型设置一个单独的查找表,但我更喜欢在不同的代码下将它们全部放在一个中,以实现紧凑和优雅。那么我想有一些形式的参照完整性约束(如果上面排除了FK),它将强制执行所有它可以进入APPELLATE_CRT_ID的是来自COURT表的CRT_ID值,但仅限CRT_TYPE =&#39 ; A' 等。普通的FK也允许Ds和Ts,但我想让它更具限制性。
有没有办法制定可以限制主键表中一系列值的FK,还是应该使用RULE
或其他类型的CONSTRAINT
?
答案 0 :(得分:1)
如果您希望查找表具有参照完整性,则需要向CRT_TYPE
表添加多个legal_case
列,并将这些列作为外键的一部分包含在内。像
CREATE TABLE legal_case (
legal_case_id integer primary key,
appellate_crt_id integer,
appellate_crt_type varchar2(1),
district_crt_id integer,
district_crt_type varchar2(1),
...
constraint fk_appelate_crt foreign key (appelate_crt_id, appellate_crt_type) references court(crt_id, crt_type),
constraint fk_district_crt foreign key (district_crt_id, district_crt_type) references court(crt_id, crt_type),
...
);
当然,这需要court
表的主键(或者我不喜欢引用nno-primary键的外键的唯一约束)crt_id, crt_type
而不仅仅是{{} 1}}。
否则,您将考虑编写触发器以验证此类事情(如果您希望阻止会话A修改crt_id
行,而会话B具有依赖于此类的未提交更改,则会更加痛苦该行的现有状态)或可能创建一个court
物化视图,其中包含一组适当的约束,这些约束组合了这两个表中的数据。