2012-07-13 157 views
3

我正在對需要建模的數據問題進行大腦停用。我會盡我所能勾勒出的表,和關係數據庫架構建議

users (basic user information name/etc) 
users.id 

hospitals (basic information about hospital name/etc) 
hospitals.id 

pages 
pages.id 
user_id (page can be affiliated with a user) 
hospital_id (page can be affiliated with a hospital) 

這是新的數據開始的地方,和我有一個問題

groups (name of a group of pages) 
groups.id 

groups_pages (linking table) 
group_id 
page_id 

現在這裏是棘手的部分..一組可以由用戶或醫院「擁有」,但這些頁面不一定與該用戶/醫院有關。此外,還有另一類型的可以「擁有」該組的公司(公司)

當顯示該組,我需要知道什麼類型(用戶/醫院/公司)該組是並能夠得到正確的相關數據(姓名,地址等)

林借鑑如何組鏈接到其各自所有者,明知其各自擁有者可以是不同的一個空白。

+0

什麼是頁? – 2012-07-13 16:11:58

回答

0
  • Party是個人或組織的通用術語。
  • 保留Party表中的所有常用字段(電話號碼,地址..)。
  • PersonHospital應該只有子類型的特定字段。
  • 如果公司Hospital有不同的列集,只需將其添加爲另一個子類型即可。
  • 如果Hospital公司具有相同的列,重命名Hospital更通用Organization
  • PartyType是鑑別{P,H}

enter image description here

+0

這和我登陸的地方非常相似 - 尤其是。將醫院/醫院等命名爲更通用的組織術語 – cgmckeever 2012-07-30 13:26:31

0

你必須使用某種形式的鑑別器。就像添加一個帶有「owner_type」的列一樣,您可以使用enum,vchar或int來表示該列所代表的所有者類型。

0

Here是如何同時保持合理的正常形態和參照完整性數據庫中的繼承模型一個很好的教程。

壓縮版本爲您創建另一張表owners,並讓它保留一小部分屬性(用戶和醫院有共同點,可能是全名,地址,當然還有一個id)。用戶和醫院將有各自的id列,它們將同時作爲它們的主鍵以及引用users.id的外鍵。爲用戶提供醫院不具備的屬性,反之亦然。現在,每個醫院由兩個易於連接的行代表,一個來自owners,另一個來自hospitals

這可以讓你從groups.owner_id參考users.id

(還有,你爲用戶和醫院只創建一個表,把空值到不適用於特定行中的所有列一個簡單的替代,但很快變得笨重。)

0
HospitalGroups(HospitalID, GroupID) 
UserGroups(UserID, GroupID) 
CompanyGroups(CompanyID, GroupID) 

Groups(GroupID,....) 

GroupPages(GroupID, PageID) 

Pages(PageID, ...) 

將是經典的方式。

通過@Robert提到的鑑別理念也將工作,但你失去了參照完整性,所以你需要更多的代碼,而不是更多的表。

+0

與多組連接表。當從組中選擇每個組時,如何知道附加數據是否在醫院/用戶/公司表中? – cgmckeever 2012-07-13 14:09:02

+0

關於什麼的其他數據?如果是關於頁面或組,那麼它不應該在這些表中。 – 2012-07-13 18:05:30