2014-04-23 45 views
1

我想設計一個用戶數據庫來迎合多個用戶。每種類型的用戶將具有不同的配置文件來填寫,例如,商業用戶將有一個網站領域,商業名稱,而普通用戶將有例如出生地點,家庭地址。用戶類型的數據庫規範化

他們也將分享一些常見的,如活躍,日期註冊,名字。從面向對象的approuch中,我將擁有一個共同的基礎,然後從基礎繼承來形成單獨的配置文件。但是從數據庫設計approuch應該如何實現呢?我們應該有一個共同的userProfile表,然後是businessProfile。用戶類型會隨着時間的推移而增長,因此一遍又一遍重複相同字段的問題可能會令人討厭,但是具有總規範化數據庫的連接可能會很慢。

任何人都可以幫助我解決這個問題嗎?

回答

2

我會去用含大家一個主表和幾個專業(1比0或1)只包含該類型的用戶表:

AllUsers 
    UserID   int identity PK 
    Active   char(1)? 
    DateRegistered date 
    FirstName  {string} 
    ..all other common columns here 

BusinessUsers 
    UserID int PK and FK to AllUsers 
    Website {string} 
    ..all business only columns 

NormalUsers 
    UserID int PK and FK to AllUsers 
    BirthDate date 
    ..all normal user only columns 

..any other user types tables as needed 

如果您需要加載一切爲了用戶做:

SELECT 
    * --please only return the columns you actually need! 
    FROM AllUsers      u 
     LEFT OUTER JOIN BusinessUsers b ON u.UserID=b.UserID 
     LEFT OUTER JOIN NormalUsers n ON u.UserID=n.UserID 
    WHERE u.UserID=123 

,如果你只需要加載數據爲特定類型的應用:

SELECT 
    * --please only return the columns you actually need! 
    FROM AllUsers      u 
     LEFT OUTER JOIN NormalUsers n ON u.UserID=n.UserID 
    WHERE u.UserID=123 
--or 
SELECT 
    * --please only return the columns you actually need! 
    FROM NormalUsers n 
    WHERE n.UserID=123 
+0

這是正確的答案。此模式的名稱是「類表繼承」 –

0

我個人會使用配置文件表(以邏輯組 - 或一張表開始,但認真,它可能很寬),然後在單獨的元數據層中處理「哪個配置文件需要哪些字段」。