2012-04-27 51 views
1

我有編碼一多了一些困難,許多關係:需要的編碼多了一些建議和反饋:在MySQL

enter image description here

我想這些:一對多的關係,如下圖所示的圖像表和關係設置,以便:

  • 家長可以有一個以上的孩子(這裏的孩子是 「播放器」),和一個孩子可以有一個或更多的家長(最多 二) 。
  • 「家庭」可以由一個或多個父母(最多兩個), 以及一個或多個孩子(無限)組成。

我不知道如何適應父母的姓氏不同於他們的「孩子」,反之亦然。我還沒有被告知這是否會成爲問題,但這是我認爲值得考慮的事情。 Parent和Player類都繼承了人類超類的字段(如名字,姓氏,地址,年齡,d.o.b等)。

我正要測試一些輸入到家庭餐桌,當我意識到我並不完全知道如何插入一個或更多的家長與一個或一個以上的孩子,他們的父母(或照料者)。我認爲我理論上已經理清了這一點,但經過測試後,我意識到它不會工作,我已經花了90多分鐘時間對一些想法進行草圖繪製,但我真的迷失了方向。

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

UPDATE:27-04-2012 @ 22:19 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類作爲超類,而父/子表作爲子類)。通過使用外鍵引用其他一些表格(「學校ID」字段來自名爲「學校」的表格,其具有「學校名稱」字段)。

我不確定我是否已經爲我想實現的目標構建了表格,但是通過做一些研究,我發現了一個名爲GROUP_CONCAT的函數,它至少給了我一個關於查詢可能的外觀的函數 - for這個特殊的問題。

容納不共享同一姓氏的父母,以及孩子不共享相同的姓氏作爲父母,是另一個大的挑戰,我不能甚至試圖繞到我的頭(我我想這對寄養家庭來說也是如此)。因此,對於上面的可視化,我假設非單親父母已婚並且擁有相同的姓氏,並且這兩個孩子的父姓都是一樣的。

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

這是我嘗試過的一些代碼着手創建設法解決這部分數據庫的一部分(注:「玩家」是父母的「兒女」):

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; 

如果有人能幫助我理清這個問題給出一些指導,甚至一些通用的例子和解釋,那將是非常好的。我認爲這是一種多種多樣的關係,我不能完全放棄,因爲父母可以有一個或多個孩子,而一個孩子可以有一個或多個父母(在這種情況下,一個家庭不會真正成爲一個沒有孩子的家庭)。

非常感謝提前!

+0

如何通過另一列擴展'家庭'表爲secont家長? – mrab 2012-04-27 06:09:38

+0

@mrab你能解釋一下這一點嗎?我正在使用「Parent」表中的外鍵來鏈接「Family」表,因此我如何在這裏照顧至少兩個父母? – Rob 2012-04-27 10:50:45

回答

2

一個孩子可以有不超過2個父母,他們都有特定的角色(母親與父親),並且可能存在父母一方或雙方未知的情況。

因此,這不是一個真正的「多對多」的關係,但實際上「很多到零或一個或兩個」,它可以自然地這樣表示(包括MotherIDFatherID是爲空的):

enter image description here

如果你把LastName兩個ParentPlayer(或你的情況的通用超),這也自然包括了那些父母和他們的孩子不同姓氏的情況。

然後,您可以輕鬆地獲得「每個父母的子女」這樣的(SQL Fiddle)...

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 

...並在應用程序代碼透視數據,如果這是你的願望。


上述模型允許Parent的性別和其母親/父親的角色之間的不匹配。如果你想避免這種情況,你可以走極端,做這樣的事情...

enter image description here

...但我寧願不要複雜化,並與第一種模式,並堅持在應用程序級別執行此。

+1

*「一個孩子可以有不超過2個父母,他們都有特定的角色(母親與父親)」*除了我們有收養或[同性戀婚姻](http://qntm.org/gay)被允許:) – 2012-04-27 13:46:01

+0

@ypercube當然,b那麼我們可以簡單地聲明一個父母爲「父母1」,另一個父母爲「父母2」,並且不需要從根本上改變邏輯。唯一的問題是,如果我們想要模擬一個情況,即可能有2個以上的「父母」(例如我們想要統計生物父母和養父母) - OP將不得不決定這種情況是否足夠重要證明模型複雜化。 – 2012-04-27 18:03:41

+0

我的意思不是 - 以任何方式 - 你的答案是無效的。只是想要添加該鏈接的藉口。它有關於婚姻 - 家庭關係建模的相當好的選擇列表。 – 2012-04-27 19:34:18

0

實現多對多關係的Family表通常在用戶輸入了Parent/Player(s)數據後創建。通常,用戶界面將被描述爲主表格/子表格組合,其中從主表格中輸入/選擇父表格,並且在子表格中輸入/顯示與父表格相關聯的一個或多個玩家;通常是某種網格。

+0

非常感謝您的反饋:)。雖然我只使用命令行作爲「接口」......我只是使用MySQL來解決這個問題。我想實現的目標是讓家庭表(兩張許多桌子之間的連接表)爲每個家長設置兩列 - 其中一張是強制性的,然後是能夠擁有無限量兒童的東西。因爲其中一個父母是可選的,所以我不能將它們作爲主鍵使用。 – Rob 2012-04-27 07:48:21

+0

...另外,我真的不希望每個孩子的記錄都存在重複列表 – Rob 2012-04-27 07:49:44

+0

大家好,我剛剛遇到這個鏈接:http://www.dougboude.com/blog/1/2009/12/A-SWEET-Little-MySQL-Function-GroupConcat.cfm - 這是給我的一些線索,但仍然可以隨時提供您的幫助...... – Rob 2012-04-27 08:08:04

2

我會質疑家族實體的使用。由於離婚和隨後的父母再婚,孩子可以成爲兩個家庭的成員 - 你會如何塑造?可能一個孩子沒有四個人有效地扮演「在父母的身邊」?

1

所有你需要的是一個有兩個字段的連接表:孩子,照顧者。這基本上就是你的「家庭」表 - 我不明白你的「父母」表的目的。在「家庭」 BOTH值將外鍵的「人」(即讓「玩家」比你有你的圖中更通用的表格。)

這則允許任何孩子有任何數量的護理人員。任何看護者都可以和任何數量的孩子聯繫在一起。所有可能的不正當的和美妙的家庭安排的組合都可以容納。

0

我不確定這是否是一個「答案」本身,但這是我的嘗試在調整我的MySQL代碼以適應什麼Branko Dimitrijevic的回答提供了我。下面是有關對錶我調整MySQL代碼:

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; 

這是這些表的邏輯模型的一部分:

enter image description here

如果布蘭科,或其他任何人,可以驗證我的與Branko的答案嘗試,這將是很好的。你也會注意到,我正在爲模型使用MySQL Workbench。

以下是超出範圍對於這方面的問題,但如果有人能幫助這也將是巨大的:

我一直要求不使用反向或正向工程轉換SQL代碼模型模式但這使我能夠驗證我在Visio中構建的模型的正確性。不過,我不能完全得到的Visio模型看起來像工作臺模型 - 這裏是的Visio版本我想爲上述模型中的表:

enter image description here

正如你可以在Visio中的版本看到, 「fatherID」和「motherID」列沒有被指示爲外鍵,這正是我想要的(並在Workbench版本中進行了說明)。如果有人能幫助我讓我的Visio模型看起來與Workbench版本相同,那將是一件好事。

0

我不知道爲什麼一個人會有多個地址 - 但我想他們可以。但是,如果我正在做多個地址,那麼我會將地址推入另一個表,並有一個person_address加入表。這樣您就不會爲居住在同一地址的每個人重複地址數據。

您的父母表需要兩個字段 - 一個用於父母,另一個用於玩家(正如我之前所說的BOTH我認爲如果他們都指向人,它會更好地工作)。爲什麼你有paren和player之間有兩條關係?

此人|父母關係不會是1..1 - 1..1,因爲這意味着每個人都是父母,您的玩家可能不是。

只是在旁邊 - 但你真的好像專注於一位母親和父親。可能沒有任何一個或多個。你不需要單獨的關係來規定性別 - 這應該是PERSON中的數據,或者根本就不是那些與數據無關的數據。