2012-08-09 92 views
0

我有一些复杂的约束条件和一些跨越多个表。复制列(主键的一部分)以执行约束还是使用存储过程更好?复制列来强制约束?

下面是一个例子:

create table responses 
(
    resp_id int PRIMARY KEY 
    participant_id int, 
    session_id int, 
    form_id int, 
    section_id int, 
    sec_target_id int, 
    quest_id int, 
    input_method_id int, 
    foreign key(form_id, section_id) references form_sections(form_id, section_id), 
    foreign key(section_id, quest_id) references questions(section_id, quest_id), 
    foreign key(session_id, form_id) references session_forms(session_id, form_id), 
    unique(resp_id, session_id) 
); 

create table user_responses 
(
    resp_id int PRIMARY KEY 
    participant_id int, 
    session_id int, 
    instructor_id int, 
    foreign key(resp_id, session_id) references responses(resp_id, session_id), 
    foreign key(session_id, instructor_id) references session_instructors(session_id, instructor_id) 
); 

可以有两种类型的响应:匿名或用户。用户响应中有一位讲师与每个会话相关联。 在user_responses表中,我从响应表中复制了session_id列,以便我可以强制将instructor_id实际分配给选定会话的约束。

像这样有许多复杂的约束和一些未来可能导致DDL变更的附加要求,是通过SP还是上述方法强制执行约束更好?

+0

可以修改响应类型吗? user_response可以成为匿名用户还是匿名用户? – 2012-08-09 18:34:01

回答

0

是的,通常情况下最好是复制列以在需要时强制约束。留意一些可能会改变道路的边缘情况,但总的来说,我发现这种方法没有任何问题。这里重要的一点是能够执行组合外键是有帮助的。我不记得MySQL是否有这种能力,但大多数RDBMS应该。