2013-06-13 47 views
1

我創建了一個有6種不同用戶類型(web_users,sellers,repair_centers,...)的數據庫,它們都有常用的選項(列)但每一個都有一些其他用戶類型沒有的獨特列。結合幾個不同類型的表與公共列

現在我想知道創建一個具有公共列的用戶表是否明智,並使用另一個表作爲這些唯一列的選項表,還是應該爲每個用戶類型創建一個單獨的表?

編輯:實際上所有不同類型的網站都會有相同的功能。差異就像賣家可以擁有web_users所不能的標識。生產者擁有其他人沒有的Producer_ID(由政府定義)。和...... 和所有那些獨特的列是固定的值,沒有對它們進行任何操作。

+1

這是明智的,如果它可以更容易執行的大多數需要在這些表進行操作。這些選項是稱爲[具體表繼承](http://martinfowler.com/eaaCatalog/concreteTableInheritance.html)和[類表繼承](http://martinfowler.com/eaaCatalog/classTableInheritance.html)的模式。根據您需要支持的功能,您可以決定使用哪一個。編輯:還有第三個相關的模式,稱爲[單表繼承](http://martinfowler.com/eaaCatalog/singleTableInheritance.html) – GolfWolf

+0

@ w0lf我編輯了我的問題,你可以請看看它嗎? –

回答

1

這是一個有趣的問題。如果是我,我會使用兩個表格:一個用於所有常見屬性,另一個用於用戶的所有外圍屬性。事情是這樣的:

CREATE TABLE _UserProperties(
    ID int , 
    Property varchar(1000) , 
    Value varchar(1000) , 
    UserID int 
) ; 
    insert into _UserProperties(id, property, value, userid) 
    values (1,'employee id', '123556',1), 
     (2,'CustomerID', '345677',2), 
     (2,'SalesGroup', 'ABFD34',2), 
     (2,'SalesToDate', '2344',2), 
     (3,'Project', 'cat juggling',3); 


    CREATE TABLE _Users(
    ID int , 
    UserName varchar(50) , 
    UserAddress varchar(1000) , 
    UserType varchar(50) 
) ;  

    insert into _Users (ID, UserName, UserAddress, UserType) 
    values (1,'Fred Jones','123 Mample','Customer'), 
     (2,'Sam Smith','234 Oak','Employee'), 
     (3,'Sally Black','345 Pine','Consultant'); 

然後你可以用一個簡單的查詢一切結合起來,如:

select * from _users a left join _userProperties b 
on a.id = b.userid 

或使用數據透視表製作中的列行。

這裏有一個SQL Fiddle View

+0

是的,我確實想到了這一點,但不確定是使用它還是分開表格 –

+0

我認爲將每個數據元素分解到它自己的表格會使得編程更容易,但是如果它報告您在提供解決方案之後或快速提供解決方案,少量表格可以提供幫助。 – Brian