2010-04-17 148 views
2

我想知道什麼是在我的數據庫中存儲不同類型的用戶的最佳方式。將用戶存儲在數據庫中

我正在寫一個具有4種主要用戶類型(管理員,學校,教師,學生)的應用程序。 目前我有這些表中的每一個,但我不知道這是存儲用戶信息的最佳方式。例如:允許學生下午其他學生很簡單(存儲發件人和收件人student_id),但啓用老師給PM學生需要另一個表(發件人teacher_id,發件人student_id)。

是否應將所有用戶都存儲在一個user_type字段的用戶表中?如果是這樣,老師/學生的具體信息仍然必須存儲在另一個表中。

users 
user_id, password_hash, user_type 

students 
user_id, student_specific_stuff... 

teachers 
user_id, teacher_specific_stuff... 

如何停止誰擁有USER_TYPE用戶=被意外學生被輸入到教師表(既是有USER_ID)

只是想確保我拿到之前數據庫正確我走得更遠。 謝謝...

回答

0

您必須問自己,如果一個用戶必須是這些類型中的一個(並且只有一個),或者它可能有零個或多個這些類型......在後面的例子中至少),你應該將「用戶」與「角色」分開。

但這些問題以及其他問題通常是更好的在應用程序的全球設計階段(定義域對象和它的關係)回答,然後映射到數據庫。因此,舉例來說,你可以決定用戶是具有附加一個/多個角色(用戶「有」角色),或者是一個實體和管理是用戶的一個子類(管理「是」用戶)。

您可能還會關注關係數據庫中類繼承的常見實現(即使您不是在執行OOP時也是如此,即使您不選擇'是'建模),它也會顯示possible alternatives。 ..並告訴你,沒有普遍正確的方法。

1

有存儲在數據庫中的類層次結構,每一個分層策略表和每類策略表中的兩個主要策略。就像你建議的那樣,在每個層次的表中,你需要一列來區分用戶類。

這一切歸結爲您是否處理真正不同或具有共同基礎的對象。例如,是否有適用於任何類型用戶的操作?

它往往是主觀的,但幾乎所有的時間我去每個層次結構戰略的表。您經常會發現需要查詢所有用戶或將外鍵添加到用戶表中。

此外,每個層次結構的表的變體是連接用於類的子表,例如,您可以添加僅包含教​​師特定列的教師表,並在用戶表中使用連接。

+0

感謝您的所有答案的傢伙的東西。我認爲我會選擇層次結構戰略。我注意到你們中沒有人回答問題的第二部分......我將如何阻止用戶作爲學生課而被意外輸入到「額外的管理信息」表中。 是否有某種方式MySQL可以檢查,或者我將不得不在我的web服務中檢查? – EMcKenna 2010-04-17 16:58:33

0

對於用戶,您將擁有2個表格:用戶和組。

寫像老師或學生特定實體的具體數據,使用單獨的表,它們有一個外鍵的用戶表中的用戶。

1

您的主要users表應該有一個user_type_id列,它將用戶鏈接到它們的類型。然後當你插入一個用戶時,你只需確保爲他們的user_type存儲了正確的值。

要存儲額外的數據,您可以在users表中添加一列,名爲extra_information_id(或其他)。然後你可以有兩個表,student_informationteacher_information。在插入/更新/選擇用戶時,可以使用user_type_id列和extra_information_id列的組合來決定爲特定用戶額外信息使用哪兩個額外信息表。

0

使用ORM而言,我通常通過以下方式實現身份驗證:

user = id, user id/name, password, created datetime, updated datetime, last login datetime 

user has many roles 

使用連接角色之間的表&用戶,讓用戶可以是一個老師&管理員,或學生&老師。

角色可以是簡單的

role = id, role name, 

或矩陣式的權限系統,如MySQL的用戶表

role = id, name, can_write, can_read, etc...