2014-02-16 54 views
0

我有2種用戶。他們都有一些共享的信息,如:用戶名,電子郵件,密碼,電話......但每種用戶都有一些其他設置,只與這種用戶有關,現在我想到了3種方法:針對不同類型用戶的sql-server一對一關係表

具有1級的用戶表,並且具有所有列的所有類型的用戶(每行將具有不相關的該種用戶幾個空列),其具有3個表

  • 用戶usertype1

    1. usertype2。共享設置將保存在用戶表中,並且與usertype1或usertype2(基於用戶類型)存在一對一關係

    2. 一個用戶表和一個設置表,這是更動態的,但這有一個問題我必須爲所有設置使用varchar類型。

    哪一個更明智?我擔心未來的用戶類型可能會增加。

  • 回答

    1

    您的第二個選項是最合適的。除了你所描述什麼,我想補充一欄,Main_Users表USER_TYPE這在表User_Types只有兩個 值

    USER_TYPE

    PK_TypeID User_Type 
        1  usertype1 
        2  usertype2 
    

    Main_User引用

    只有每個用戶都會擁有的列如同名字,姓氏,Dob,用戶ID以及每個用戶將擁有的任何其他信息。

    U_ID | Column1 | Column2 | Column3 | User_Type --<-- User Type values(1,2) 
                     -- from User_Type Table 
    

    類型1

    這將是僅用於與一個類型並且只有一個第一類型的用戶將具有列中的用戶。在主用戶表中使U_ID作爲引用U_ID列的外鍵。

    U_ID | Column1 | Column2 | Column3 
    

    2型

    這將是僅適用於Type Two,只列了用戶一個類型user will have.Make U_ID`外鍵的主要用戶表引用U_ID列。

    U_ID | Column1 | Column2 | Column3 
    
    +0

    其實這也正是我的想法。但在我讀到的任何地方,他們都說不要拆分桌子,除非你真的被迫。這讓我害怕,爲什麼?爲什麼人們這麼反對分開桌子? –

    +0

    這意味着你有一個非常好的設計,然後:),不要關注「每個人都在說」什麼,遵循數據庫規範化的簡單規則。遵循這種設計,您將使您的數據庫以第三種正常形式出現。 [在這裏閱讀關於數據庫規範化](http://databases.about.com/od/specificproducts/a/normalization.htm) –

    +0

    我一直是一個程序員17年,我所知道的只是經驗,我只學到了自己使用互聯網作爲參考,這就是爲什麼有時當我聽到某些事情時,我認爲背後有一個我不知道的科學原因。但正如你所說,第二種選擇更有意義,我會去做。非常感謝 –

    0

    我會認爲選項3會是最好的,而且您不必爲所有設置使用varchar。你需要的是第三個查找值表,如(Setting_ID, Setting_Description)。在設置表中使用Setting_ID以及該設置的值。

    +0

    我沒有安靜的捕捉如何可以我有例如datetime,int,bit,varchar數據類型?他們都必須以varchar格式保存,然後將其轉換正確? –

    +0

    @AshkanMobayenKhiabani我已經看到了一些實現,其中設置表爲每個數據類型(Value_ID,Setting_ID,Date_Value,Int_Value,...)設置了一列,並且您可以將相應的值存儲在相應的列中。其他選項是使用SQL_Variant數據類型[link here](http://msdn.microsoft.com/zh-cn/library/ms173829.aspx) – sebby

    +0

    另請注意,M Ali的實現也適用於大多數情況,但它會變得稍微如果您想爲任何用戶類型添加更多設置,則會出現問題。您必須更改主應用程序中與用戶類型相關的所有查詢以表示新設置。 – sebby

    相關問題