需要一些关于在MySQL中编码多:多关系的建议和反馈吗

需要一些关于在MySQL中编码多:多关系的建议和反馈吗,mysql,sql,database,database-design,relational-database,Mysql,Sql,Database,Database Design,Relational Database,我在编码多:多关系时遇到一些困难,如下图所示: 我希望设置这些表和关系,以便: 一个家长可以有多个孩子(这里的孩子是 “玩家”),并且一个孩子可以有一个或多个父母(最多 二) “家庭”可以由一个或多个父母(最多两个)组成, 还有一个或多个孩子(不限) 我不知道如何适应与“子女”姓氏不同的父母,反之亦然。我还没有被告知这是否会引起关注,但我认为这是值得考虑的事情。父类和播放器类都从person超类继承字段(如名字和姓氏、地址、年龄、d.o.b等) 我正要测试家庭表中的一些输入,这时我意识到我

我在编码多:多关系时遇到一些困难,如下图所示:

我希望设置这些表和关系,以便:

  • 一个家长可以有多个孩子(这里的孩子是 “玩家”),并且一个孩子可以有一个或多个父母(最多 二)
  • “家庭”可以由一个或多个父母(最多两个)组成, 还有一个或多个孩子(不限)
我不知道如何适应与“子女”姓氏不同的父母,反之亦然。我还没有被告知这是否会引起关注,但我认为这是值得考虑的事情。父类和播放器类都从person超类继承字段(如名字和姓氏、地址、年龄、d.o.b等)

我正要测试家庭表中的一些输入,这时我意识到我不确定如何插入一个或多个父母,他们有一个或多个孩子,他们是他们的父母(或照顾者)。我以为我已经从理论上解决了这个问题,但经过测试,我意识到这是行不通的,我花了90多分钟的时间画了一些想法的草图,但我真的迷路了

========================================================================================================================================

更新:2012年4月27日,新西兰时间下午22:19

当查询包含这些表的数据库时,我应该给出我正在寻找的结果的可视化表示。以下是视觉表现:

+-------------------+-----------------+---------------------+
| ParentsFirstName  | ParentsLastName | ChildrenInFamily    |
+-------------------+-----------------+---------------------+
| Gregory           | Peck            | Michael             |
| Laura             | Peck            | Michael             |
| Martha            | Petersen        | Matt, Christopher   |
| Chris             | Michaels        | Richard, Shaun      |
| Nadine            | Michaels        | Richard, Shaun      |
| Barry             | Dackers         | Harry               |
| Kevin             | Mitchell        | Daniel              |
| Rebecca           | Mitchell        | Daniel              |
+-------------------+-----------------+---------------------+
“子项”在一个名为“Player”的表中,父项在一个名为“Parent”的表中。本文中的MySQL代码表示与此特定问题相关的表(您应该注意,我将Person类用作一个超类,将父/子表用作子类)。其他一些表是通过使用外键来引用的(“schoolID”字段来自一个名为“School”的表,该表有一个“schoolName”字段)

我不确定我是否为我想要实现的目标构建了正确的表,但通过一些研究,我发现了一个名为的函数,它至少让我想到了这个特定问题的查询可能是什么样子

另一个巨大的挑战是,如何照顾那些姓氏不同的父母,以及那些与父母姓氏不同的孩子,这是我甚至都无法想象的(我想寄养家庭也是如此)。因此,对于上面的形象,我假设非单亲父母已婚,并共享相同的姓氏,而孩子们都与已婚父母共享相同的姓氏

========================================================================================================================================

下面是一些代码,我试图创建数据库中试图处理这一部分的部分(注意:“玩家”是父母的“孩子”):

如果有人能帮我解决这个问题,给我一些指导,甚至一些一般性的例子和解释,那就太好了。我认为这是一种多对多的关系,我不能完全放弃,因为父母可以有一个或多个孩子,而孩子可以有一个或多个父母(在这种情况下,一个家庭不会真的是一个没有孩子的家庭)


非常感谢

实现多对多关系的族表通常在用户输入父/玩家数据后创建。UI通常被描述为主窗体/子窗体组合,其中父窗体被输入/从主窗体中选择,并且与父窗体关联的一个或多个玩家被输入/显示在子窗体中;通常是某种网格。

实现多对多关系的族表通常在用户输入父/玩家数据后创建。UI通常被描述为主窗体/子窗体组合,其中父窗体被输入/从主窗体中选择,并且与父窗体关联的一个或多个玩家被输入/显示在子窗体中;通常是某种网格。

一个孩子最多只能有两个父母,他们都有特定的角色(母亲和父亲),可能有一个或两个父母都不知道的情况

因此,这不是一个真正的“多对多”关系,它实际上是“多对零或一或二”,可以这样自然地表示(母亲ID和父亲ID都可以为空):

如果将
LastName
放在
Parent
Player
中(或者在您的情况下放在一个公共超类中),这自然也涵盖了父母与子女姓氏不同的情况

然后,您就可以很容易地得到这样的“每个父项的子项”

…并根据需要在应用程序代码中透视数据


上述模型允许父母的性别与其母亲/父亲角色不匹配。如果你想防止这种情况,你可以过火,这样做


…但我不想将第一个模型复杂化,坚持第一个模型,并在应用程序级别强制实施。

一个孩子最多只能有两个父母,他们都有特定的角色(母亲和父亲),可能会出现一个或两个父母都不知道的情况

因此,这不是一个真正的“多对多”关系,它实际上是“多对零或一或二”,可以这样自然地表示(母亲ID和父亲ID都可以为空):

如果将
LastName
放在
Parent
Player
中(或者在您的情况下放在一个公共超类中),这自然也涵盖了父母与子女姓氏不同的情况

然后你可以很容易地得到像这样的“每个父母的孩子”
DROP TABLE IF EXISTS `person` ;
CREATE TABLE `person` (
  `personID` INT(5) NOT NULL AUTO_INCREMENT ,
  `firstName` VARCHAR(50) NOT NULL ,
  `lastName` VARCHAR(50) NOT NULL ,
  `dateOfBirth` DATE NOT NULL ,
  `personType` CHAR(6) NOT NULL, 
  `photo` BLOB NULL DEFAULT NULL ,
  PRIMARY KEY (`personID`))
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `parent` ;
CREATE TABLE `parent` (
  `parentID` INT(5) NOT NULL,
  FOREIGN KEY (`parentID`) REFERENCES `person` (`personID`)
  ON DELETE CASCADE 
  ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `player` ;
CREATE TABLE `player` (
  `playerID` INT(5) NOT NULL, 
  `schoolID` INT(5) NOT NULL,
    FOREIGN KEY (`playerID`) 
    REFERENCES `person` (`personID`)
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    FOREIGN KEY (`schoolID`)
    REFERENCES `school` (`schoolID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `family` ;
CREATE TABLE `family` (
  `parentID` INT(5) NOT NULL ,
  `playerID` INT(5) NOT NULL ,
  PRIMARY KEY (`parentID`, `playerID`), 
    FOREIGN KEY (`playerID` )
    REFERENCES `player` (`playerID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
    FOREIGN KEY (`parentID`)
    REFERENCES `parent` (`parentID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;
SELECT
    ParentID,
    Parent.FirstName ParentFirstName,
    Parent.LastName ParentLastName,
    PlayerID,
    Player.FirstName PlayerFirstName,
    Player.LastName PlayerLastName
FROM
    Parent
    LEFT JOIN Player
        ON Parent.ParentID = Player.MotherID
        OR Parent.ParentID = Player.FatherID
ORDER BY ParentId
DROP TABLE IF EXISTS `person` ;
CREATE TABLE `person` (
  `personID` INT(5) NOT NULL AUTO_INCREMENT ,
  `firstName` VARCHAR(50) NOT NULL ,
  `lastName` VARCHAR(50) NOT NULL ,
  `dateOfBirth` DATE NOT NULL ,
  `personType` CHAR(6) NOT NULL, 
  `photo` BLOB NULL DEFAULT NULL ,
  PRIMARY KEY (`personID`))
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `parent` ;
CREATE TABLE `parent` (
  `parentID` INT(5) NOT NULL,
  PRIMARY KEY (`parentID`), 
  FOREIGN KEY (`parentID`) REFERENCES `person` (`personID`) 
  ON DELETE CASCADE 
  ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;

DROP TABLE IF EXISTS `player` ;
CREATE TABLE Player (
    `playerID` INT(5) NOT NULL,
    `motherID` INT(5),
    `fatherID` INT(5),
    `schoolID` INT(5),
    PRIMARY KEY (`playerID`), 
    FOREIGN KEY (`playerID`) REFERENCES `person` (`personID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    FOREIGN KEY (`motherID`) REFERENCES `parent` (`parentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE,
    FOREIGN KEY (`fatherID`) REFERENCES `parent` (`parentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    FOREIGN KEY (`schoolID`) REFERENCES `school` (`schoolID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE)
ENGINE = InnoDB;
SHOW WARNINGS;