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

最佳MySQL表结构:2个父表,1个子表,mysql,database-design,Mysql,Database Design,我有两个父表BusinessGroup和SocialGroup,还有一个子表Members。成员可以属于任一父级,但不能同时属于两个父级 就我所见,有两种方法可以构造子表 选项1:为ParentType包含一个字段,为ParentID包含另一个字段。ParentType将是一个enum(Business、Social),ParentID将是相应父表中的PK 选项2:为BusinessGroupID包含一个字段,为SocialGroupID包含另一个字段。在这种情况下,字段需要为空,并且只有一个字

我有两个父表BusinessGroup和SocialGroup,还有一个子表Members。成员可以属于任一父级,但不能同时属于两个父级

就我所见,有两种方法可以构造子表

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

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

对哪种方法最好有什么想法

我在MySQL中尝试了选项1,并创建了两个从孩子返回父母的外键。但我在插入值时遇到了麻烦,因为MySQL希望在两个父表中都有对应的值

作为补充问题:如果我有更多的父母(例如6个),情况会发生什么变化

谢谢

“父表”可能用词不当——在关系模型中,我会颠倒您的关系。e、 g.使成员成为主记录表和允许1-1映射的联接表,因此具有成员id的PK或任何正确字段,并映射到BusinessGroup或SocialGroup中的FK。


注:选项#2包括所谓的独占弧,通常被视为不良做法。请看这两个问题,他们可能会帮助你:谢谢Damir,非常感谢。对于其他想要解释的人,请看一下Bill Karwin的精彩幻灯片
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) ;