【发布时间】:2012-05-07 21:32:36
【问题描述】:
我在编写多对多关系时遇到了一些困难,如下图所示:
我希望设置这些表和关系,以便:
- 父母可以有多个孩子(这里的孩子是 “玩家”),一个孩子可以有一个或多个父母(最多 二)。
- “家庭”可以由一个或多个父母(最多两个)组成, 以及一个或多个孩子(不限)。
我不知道如何容纳与他们的“孩子”姓氏不同的父母,反之亦然。我还没有被告知这是否会成为一个问题,但我认为这是值得考虑的事情。 Parent 和 Player 类都从 person 超类继承字段(例如名字和姓氏、地址、年龄、d.o.b 等)。
当我意识到我不确定如何插入一个或多个父母与他们是父母(或看护人)的一个或多个孩子时,我正要测试一些输入到家庭表中。我以为我在理论上已经解决了这个问题,但在测试后我意识到它不起作用,我花了 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 的函数,它至少让我想到了查询可能是什么样的 -针对这个特殊问题。
容纳不同姓氏的父母,以及与父母不同姓氏的孩子,是我什至无法解决的另一个重大挑战(我' d 想象寄养家庭也是如此)。因此,对于上述可视化,我假设非单亲父母已婚并具有相同的姓氏,并且孩子都与已婚父母的姓氏相同。
============================================== =======================================
这是我尝试创建的数据库部分的一些代码,试图处理这部分(注意:“玩家”是父母的“孩子”):
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;
如果有人可以通过提供一些指导,甚至是一些带有解释的通用示例来帮助我解决这个问题,那就太好了。我认为这是一个多对多的关系,我不能完全放弃,因为父母可以有一个或多个孩子,一个孩子可以有一个或多个父母(在这种情况下,一个家庭不会是一个没有孩子的家庭)。
提前非常感谢!!!
【问题讨论】:
-
如何将
family表扩展为第二个父级的另一列? -
@mrab 你能更全面地解释一下吗?我正在使用“父”表中的外键链接“家庭”表,那么我将如何在这里满足至少两个父母的需求?
标签: mysql sql database database-design relational-database