我在编写多:多关系时遇到了一些困难,如下图所示:
我想要设置这些表和关系,以便:
- 一个父母可以有多个孩子(这里的孩子是“玩家”),一个孩子可以有一个或多个父母(最多两个)。
- “家庭”可以由一个或多个父母(最多两个)以及一个或多个孩子(无限)组成。
我不知道如何容纳与“孩子”姓氏不同的父母,反之亦然。我还没有被告知这是否会成为一个问题,但我认为这是值得考虑的事情。Parent 和 Player 类都从 person 超类继承字段(如名字和姓氏、地址、年龄、出生日期等)。
当我意识到我不确定如何插入一个或多个父母与他们是父母(或照顾者)的一个或多个孩子时,我正要测试一些输入到家庭表中。我以为我在理论上已经解决了这个问题,但在测试后我意识到它不起作用,我花了 90 多分钟为一些想法画草图,但我真的迷路了。
==================================================== =================================
更新:27-04-2012 @ 22:19PM NZST
我应该给出我正在寻找的结果的可视化表示 - 在查询包含这些表的数据库时。这是视觉表示:
+-------------------+-----------------+---------------------+
| 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 |
+-------------------+-----------------+---------------------+
“孩子”在名为“玩家”的表中,父母在名为“父母”的表中。这篇文章中的 MySQL 代码代表了关于这个特定问题的表(你应该注意到我使用 Person 类作为超类,而父/子表作为子类)。通过使用外键引用其他一些表(“schoolID”字段来自名为“School”的表,该表具有“schoolName”字段)。
我不确定我是否已经为我想要实现的目标构建了正确的表,但是在做一些研究时,我发现了一个名为GROUP_CONCAT的函数,它至少让我想到了查询可能是什么样子——对于这个特定的问题。
容纳不同姓氏的父母,以及与父母不同姓氏的孩子,是我什至无法解决的另一个重大挑战(我想这是寄养家庭也是如此)。因此,对于上述可视化,我假设非单亲父母已婚并拥有相同的姓氏,并且孩子都与已婚父母拥有相同的姓氏。
==================================================== =================================
这是我尝试创建的一些代码,用于创建试图处理这部分的数据库部分(注意:“玩家”是父母的“孩子”):
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;
如果有人可以通过提供一些指导,甚至是一些带有解释的通用示例来帮助我解决这个问题,那就太好了。我认为这是一个多对多的关系,我不能完全放弃,因为父母可以有一个或多个孩子,一个孩子可以有一个或多个父母(在这种情况下,一个家庭不会是没有孩子的家庭) )。
提前谢谢了!!!