复制列以强制执行约束?

时间:2012-08-09 14:54:09

标签: database-design relational-database

我需要一些复杂的约束,一些跨越多个表。是否更好地复制列(主键的一部分)来强制执行约束或使用存储过程?

以下是一个例子:

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或上述方法强制执行约束会更好吗?

1 个答案:

答案 0 :(得分:0)

是的,通常最好复制列以强制执行需要的约束。注意边缘情况可能会发生变化,但总的来说,我认为这种方法没有任何问题。这里重要的一点是,能够强制执行复合外键是有帮助的。我不记得MySQL是否具备此功能,但大多数RDBMS应该。