2012-08-09 69 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應該。