2011-12-19 59 views
4

我一直在嘗試幾天來設計這個數據庫。我在訪問中設計它,然後在MYSQL服務器上實現爲PHP Web應用程序。SQL成員表顯示成員之間的家庭關係

我有一個表:

成員

  • MEMBERID(自動編號,PK)
  • 成員名稱
  • MemberDetails

成員可以與其他成員的許多關係,這可能是孩子,家長,朋友,S看到一位會員,我希望能夠與現有會員建立新的關係,然後讓相關會員看到這種關係,而無需進一步的投入。成員也應該能夠列出他們所有的關係。

你能告訴我應該怎麼做嗎?我嘗試了幾個選項,但沒有一個看起來像預期的那樣工作。我對SQL感到滿意,我只是在Unary關係設計上遇到了麻煩。

-edit- 此外,我忘了添加,由於服務器的限制,無法使用INNODB。最有可能的將是MYISAM,但我還是想引用完整性:(

+0

我認爲你需要檢討你的真實生活標識符。一個人的名字很少(大概是「家庭事務[原文如此]」表明共享姓氏!)和一個autoNumber PK將只允許重複的人進入數據庫,而不是消除重複。標識符必須標識人員,據推測他們不知道系統分配給他們的自動編號值。 – onedaywhen

+0

對不起,我簡化了數據庫表。實際PK是:MemberID,FirstName,LastName。姓氏不適用於朋友和女朋友。我正在努力專注於如何將會員與海誓山盟聯繫起來。 –

回答

0

嘗試添加的數據透視表:

Relationships: 

MemberId1 
MemberId2 
RelationshipType 
+0

我看了一下,不確定如何實現這一個到我的設計。 –

0

與collumns創建一個表:

Member_1_id 
Member_2_id 
Relation_type 

然後你可以使用它像那: 如果愛麗絲是鮑勃女兒,你會有這些關係:

<Bob id> <Alice id> 'Father' 
<Alice id> <Bob id> 'Daughter' 

然後,您可以將一些額外的數據放入這些關係中,例如關係何時開始(即,當有人訂婚)。

您可能還希望在具有成員id的兩列上創建索引。

編輯: 爲了避免重複此表中的數據,您可以創建一個視圖,然後將每個關係存儲爲只有一行。然而,這種解決方案不會讓你命名像「父親」和「兒子」這樣的關係。

SELECT member1, member2, relation FROM rel_table UNION ALL SELECT member2, member1, relation FROM rel_table; 
+0

謝謝,我試過這種方法,我看不到如何解決重複數據輸入問題,這是我試圖避免的一個問題。 –

+0

如果沒有重複的數據輸入,你將失去調用關係'兒子'和'父親'的能力,你必須給這個關係的'方向'命名同一個名字。 如何使用視圖?然後,您可以將每個成員對存儲在關係表中,並且仍然可以輕鬆使用它。 – Maciek

4

讓表members包含成員數據和表relations包含成員關係數據。 relations.member_id將會引用會員relations.related_member_id - 發送給相關會員。 relations.type是可枚舉的關係類型。

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`name` TEXT NOT NULL , 
`details` TEXT NOT NULL 
) ENGINE = INNODB; 

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`member_id` INT NOT NULL , 
`related_member_id` INT NOT NULL , 
`type` ENUM( 'Child', 'Parent', 'Friend', 'Spouse') NOT NULL, 
FOREIGN KEY (member_id) REFERENCES members(id), 
FOREIGN KEY (related_member_id) REFERENCES members(id) 
) ENGINE = INNODB; 

UPD:的MyISAM版(除去外鍵,所有可能的外鍵的功能應該由服務器端腳本處理):

CREATE TABLE `members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`name` TEXT NOT NULL , 
`details` TEXT NOT NULL 
) ENGINE = MyISAM; 

CREATE TABLE `relations` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`member_id` INT NOT NULL , 
`related_member_id` INT NOT NULL , 
`type` ENUM( 'Child', 'Parent', 'Friend', 'Spouse') NOT NULL 
) ENGINE = MyISAM; 
+0

對不起,我忘了補充說,由於服務器限制,無法使用INNODB。很可能會是MYISAM。否則,這種解決方案將是完美的,(我最初設計的,直到這個小呃被拋出我的方式) –

+0

然後使用MyISAM並刪除外鍵。您必須使用PHP處理外鍵功能。我用MyISAM表格更新了我的回覆。 – Minras

2

與@Minras設計開始(+1),我倒是有

MEMBERS 
    MemberId 
    Name 
    Details 

RELATIONS 
    FromMemberId 
    ToMemberId 
    RelationType 

但不是檢查約束,我想補充第三個表:

RELATIONTYPE 
    RelationType 
    Description 
    FromLabel 
    ToLabel 

其中RelationType是一個整數,「Labels」是字符數據。這種關係是「定向的」,因爲你必須密切關注哪個成員是「來自」,哪個是「來」(但對於「非定向」關係並不那麼重要,比如「去高中一起」)。此設計可讓您:

  • 定義具有多個標籤的人之間的關係,例如, A is father of BB is son of A
  • 如果,當添加新的關係,並在必要時

顯然,你要麼必須通過外鍵或一切關係完整性不管你有可用的,否則你將有一個火車事故等待發生。

這並沒有解決如何唯一清晰地標識具有重複名稱的成員的問題。要做到這一點,您需要考慮「真實世界中的人們用於處理這種情況(學生ID?社會安全號碼?)所用的識別屬性,或者引入特定於您的應用程序的工件(例如,登錄名+密碼)。

+0

第三張桌子不是那麼有效。 –