2009-09-29 81 views
1

在我的數據庫中有四個數據庫:教師,學生,家長和地址。有關多個一對多關係和外鍵的數據庫設計問題

教師,學生,家長可以有任意數量的地址(零個或多個)。

我想用外鍵連接教師和他們的地址(以及學生和他們的地址等)。

由於地址中的記錄可能來自教師,學生或家長,因此我無法在地址中使用(單個)外鍵。由於教師等可以有任意數量的地址,我不能在教師記錄中使用無限數量的外鍵。

這裏有什麼好策略?

我正在考慮使用中間表,但看起來有點麻煩。另外,讓每個地址記錄包含3個(可NULLable)外鍵並僅使用一個外鍵是個好主意?

回答

2

過去一直在爲我工作的東西有一個上下文和context_id字段。上下文將是父記錄(例如教師),並且context_id將是其ID。所以,你必須像

teacher = find single teacher by id 
addresses_for_teacher = find all addresses with context = 'teacher' and context_id = teacher.id 

有了適當的索引表和分佈式緩存的健康服務,我們正在對Cork'd看到了很大的成效。

1

爲每個基表添加連接表。 TeacherAddresses,StudentAddresses,ParentAddresses。

1

使用表格來表示關係可能是這裏的方法。你需要一個Parent_Address,Student_Address和Teacher_Address表。這會讓後面的查詢更簡單。

1

你有什麼是多對多的關係。因此你需要一個連接表。

在其中定義學生解決了學生證和地址ID,教師,以解決具有教師ID和地址ID等表的表...

2

我會重新設計這個(取決於結構你提到的4個表中的任意一個)放入1個具有類型列(教師/學生/家長)的表格(人員)中,使得將person_id作爲外鍵添加到地址

如果需要保留目前3人桌由於需求非常不同,因此我建議在地址上使用3字段唯一鍵:

address_id:序列(表寬或每person_type/persond_id) person_id:來自每個person_type表的唯一id person_type:values T,S,P(取決於教師/學生/父母的表格)

+0

我會有一個人桌子,然後是一個學生專用桌子,老師專用桌子和父母專用桌子,然後把PKFK放在人/地址組合上。也是人與學生,人與老師之間的PKFK。 – HLGEM 2009-09-29 22:08:12