2010-07-21 81 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。