2014-11-21 65 views
0

考虑下面的设计:对数据的Oracle参照完整性范围PK台

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 ='A' etc 。一个普通的FK可以允许Ds和Ts,但是我想使它更具限制性。

有没有一种方法来制定一个限制主键表中值的范围的FK,或者我应该去RULE或其他类型的CONSTRAINT

回答

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-主键外键)将crt_id, crt_type而不仅仅是crt_id

否则,你会看写触发器来验证这种事情(如果你想阻止会话A修改court行,而会话B有未提交的变化取决于现有的状态该行),或者可能创建具有合适的一组约束的实体化视图,这些约束组合来自这两个表的数据。

+0

'appellate_crt_type'在'legal_case'中始终是相同的值。这是多余的。我不喜欢那样。我可以有一个规则,在'appellate_crt_id'中将可接受的值范围定义为'SELECT CRT_ID FROM COURT WHERE CRT_TYPE ='A''? – amphibient 2014-11-21 18:30:42

+0

@amphibient - 是的,这是多余的。但是,鉴于你想要构建“法庭”表,这是获得参照完整性的唯一方法。这就是为什么在这种情况下我更喜欢不同的查询表。不,您不能创建一个约束来验证基于对某个其他表的查询的一个表中的数据。 – 2014-11-21 18:34:19