2010-07-21 115 views
1

我有兩個父表,BusinessGroup和SocialGroup,以及一個子表,Members。成員可以屬於任何一方,但不能同時屬於兩方。最好的MySQL表結構:2個父母,1個孩子

據我所見,有兩種構建子表的選項。

選擇1:爲ParentType包含一個字段,爲ParentID包含另一個字段。 ParentType將是一個枚舉(Business,Social),ParentID將是相應父表中的PK。

選項2:爲BusinessGroupID添加一個字段,爲SocialGroupID添加另一個字段。在這種情況下,這些字段需要可以爲空,並且只能包含一個值。

關於哪種方法最好的想法?

我嘗試了MySQL中的選項1,並從孩子創建了兩個外鍵給父母。儘管插入值時我遇到了麻煩,因爲MySQL在兩個父表中都希望有相應的值。

作爲一個補充問題:如果我有更多的父母,例如, 6?

謝謝!

+0

注:選項#2包括所謂專屬弧形,並且被普遍認爲是不好的做法。 請看這兩個問題,他們可能會幫助你: http://stackoverflow.com/questions/987654/in-a-stackoverflow-clone-what-relationship-should-a-comments-table-have-to-任務/ 987685#987685 http://stackoverflow.com/questions/621884/database-development-mistakes-made-by-appdevelopers – 2010-07-21 03:36:42

回答

1

group_model

CREATE TABLE Group ( 
    GroupID  integer NOT NULL 
    , Name   varchar(18) 
    , Description varchar(18) 
    , GroupType  varchar(4) NOT NULL 
    -- all columns common to any group type 
); 
ALTER TABLE Group ADD CONSTRAINT pk_Group PRIMARY KEY (GroupID) ; 


CREATE TABLE BusinessGroup ( 
    GroupID integer NOT NULL 
    -- all columns specific to business groups 
); 
ALTER TABLE BusinessGroup 
    ADD CONSTRAINT pk_BusinessGroup PRIMARY KEY (GroupID) 
    , ADD CONSTRAINT fk1_BusinessGroup FOREIGN KEY (GroupID) REFERENCES Group(GroupID) ; 


CREATE TABLE SocialGroup ( 
    GroupID integer NOT NULL 
    -- all columns specific to social groups 
); 
ALTER TABLE SocialGroup 
    ADD CONSTRAINT pk_SocialGroup PRIMARY KEY (GroupID) 
    , ADD CONSTRAINT fk1_SocialGroup FOREIGN KEY (GroupID) REFERENCES Group(GroupID) ; 


CREATE TABLE Person ( 
    PersonID integer NOT NULL 
    , GroupID integer NOT NULL 
); 
ALTER TABLE Person 
    ADD CONSTRAINT pk_Person PRIMARY KEY (PersonID) 
    , ADD CONSTRAINT fk1_Person FOREIGN KEY (GroupID) REFERENCES Group(GroupID) ; 
+0

謝謝達米爾,非常感謝。 對於其他尋找解釋的人來說,看看Bill Karwin的這個優秀幻燈片http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back – 2010-07-21 23:21:04

1

「父表」可能是一個用詞不當 - 在關係模型中,我會翻轉你的關係。例如使成員成爲主記錄表,以及允許1-1映射的連接表,因此具有member_id的PK或任何正確的字段,並映射到BusinessGroup或SocialGroup中的FK。