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