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