最佳MySQL表结构:2个父母,1个孩子

时间:2010-07-21 02:30:35

标签: mysql database-design

我有两个父表,BusinessGroup和SocialGroup,以及一个子表,Members。会员可以属于任何一方,但不能同时属于两者。

据我所知,构建子表有两种选择。

选项1:为ParentType包含一个字段,为ParentID包含另一个字段。 ParentType将是枚举(Business,Social),ParentID将是相应父表的PK。

选项2:包括BusinessGroupID的字段,以及SocialGroupID的另一个字段。在这种情况下,字段需要可以为空,并且只有一个字段可以包含值。

关于哪种方法最好的想法?

我在MySQL中尝试了选项1,并从孩子创建了两个外键给父母。我插入值时遇到了麻烦,因为MySQL期望在BOTH父表中有相应的值。

作为一个补充问题:如果我有更多的父母,例如,情况如何变化,例如: 6?

谢谢!

2 个答案:

答案 0 :(得分:1)

“父表”可能是用词不当 - 在关系模型中我会翻转你的关系。例如使成员成为主记录表,以及允许1-1映射的连接表,因此具有成员ID的PK或任何正确的字段,并映射到BusinessGroup或SocialGroup中的FK。

答案 1 :(得分: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) ;