2012-05-02 77 views
1

我正在將身份驗證系統應用到現有的數據庫系統中。目前,數據庫有一個「Person」表,其中包含如下內容:名字,姓氏,出生日期,電子郵件(用戶名)等。這是用戶的主表。身份驗證數據庫字段

我需要添加以下字段進行身份驗證:密碼,IsLocked,LockDate,LastLoginDate。

你會建議把這些字段放在Person表中還是放在新的認證表中?我原來的計劃是「人」只是簡單地包含有關該人的數據,而不一定涉及認證。

另一種方法可能是將密碼與電子郵件一起存儲在Person中,但將驗證數據放在單獨的表中。這樣,用戶名和密碼將在同一個地方,但元數據將在它自己的實體。

任何人有任何想法? 感謝您的幫助!

回答

2

保持帳戶信息分開。您當前的業務需求可能是每個人只有一個賬戶,但未來可能會出現一個人需要擁有多個賬戶,或者甚至需要一個由多個人共享的賬戶。有一個單獨的認證表意味着這樣的未來的變化將對你的代碼產生較小的影響

此外,從保護認證信息的角度來看,可以訪問帳戶數據的人員/流程越少越好。實現表級訪問比列級訪問更容易。

+0

感謝您的回覆。使用這種方法,您將在哪裏存儲電子郵件地址?它在整個應用程序中使用,但也可以用作用戶名。你會將它從Person抽象出來並放到Authentication表中嗎? – user543936

+0

@ user543936 - 由於我上面提到的相同原因,我會將用戶標識與電子郵件地址分開。在默認情況下,使用電子郵件地址作爲用戶ID可能是一個巧合或策略,但如果您引入組登錄或電子郵件分發列表等,將來可能會隨時更改。如果您有一條業務規則說明它們應該是同樣,然後編寫一點應用程序邏輯,在更新自動更新的應用程序邏輯之前進行檢查(只要它們在編輯之前是相同的)。 –

0

我認爲爲身份驗證數據創建一個單獨的表是不太合理的。據我所知,身份驗證不能獨立於Person存在 - 並且似乎沒有一個Person可以合理地與兩個Authentications關聯的方式(反之亦然)。

換句話說:Person和Authentication之間存在1:1的關係,那麼爲什麼要將它分離?

+1

這個數據庫有很多1:1的關係,但是我把它們拆分成邏輯實體。例如,我可以將所有用戶的職業信息放入Person表中,但將它放在「職業」表中可能更有意義,因爲它可能會擴展到更大的一些。 我想我只是想避免在Person表中放入每個1:1的關係。我不想有一個100列的桌子......所以我試圖儘早避免這個陷阱。 – user543936

+0

我明白了;這是真的,你不想結束一個怪異的單桌。我仍然建議在主Person表中保留身份驗證的內容,因爲我覺得它與那裏的信息(例如用戶名)密切相關,但我可以看到這種情況。我想,這歸結於個人偏好。 – Yuka

+3

每個人可能有多重身份驗證的原因。不同的角色可能需要一個人擁有2個或更多的密碼。例如,一個可以讓用戶訪問簡單的用戶,另一個可以讓他訪問管理員。 –

3

將它們保持分開,以便用戶可以向系統查詢有關Person的信息,而無需訪問其帳戶憑證。

這也有一個很好的副作用,並非所有Person實體可能有帳戶。

+0

您可以通過創建適當的視圖來讓用戶訪問「Person」而不是「Authentication」數據,這不是什麼大問題。 – Yuka

+0

@Yuka True。但是,對於相關的屬性拆分,該模型仍然更有意義。與「PersonContactInformation」或「PersonAddress」關係相同的想法。即使這個「人」總是隻有**一個**,將所有內容都放在一張表中是沒有意義的。 – Yuck

+0

是啊......其實, (這個,以及ypercube說的。)我想我接近了這個錯誤。 (+1) – Yuka