我需要一些复杂的约束,一些跨越多个表。是否更好地复制列(主键的一部分)来强制执行约束或使用存储过程?
以下是一个例子:
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 :(得分:0)
是的,通常最好复制列以强制执行需要的约束。注意边缘情况可能会发生变化,但总的来说,我认为这种方法没有任何问题。这里重要的一点是,能够强制执行复合外键是有帮助的。我不记得MySQL是否具备此功能,但大多数RDBMS应该。