2015-10-20 29 views
1

我試圖實現一個優化設計,將兩個SQL Server表中的列合併爲一個,以實現更好的設計和優化。如何設計具有共享列的SQL Server表

表1 - 應用程序,爲用戶

ApplicationID 
FirstName 
LastName 
Address 

表2 - 應用程序合作伙伴

ApplicationID 
CompanyName 
Address 
TaxID 

難道是明智的,跳過表1,2的創作和創建表3,將這個樣子

table3 
--------- 
ApplicationID 
FirstName 
LastName 
CompanyName 
Address 
TaxID 

兩個表之間不共享的列將保留爲空。這是設計一個SQL Server表的好方法,或者我應該堅持兩個不同的表,並添加將舉行主密鑰ApplicationID

table3 
------- 
ApplicationID 
ApplicationType (client, company) 


table1 //application for users 
-------- 
ApplicationID 
FirstName 
LastName 
Address 

table2 //application for partners 
--------- 
ApplicationID 
CompanyName 
Address 
TaxID 

回答

0

想想這個表之間關係的一類表3。

做一個企業風險管理,你會看到,最好的選擇是創建3個表。

  1. T_USER

    • USER_ID(PK)
    • 名字
    • ADRESS
  2. T_Partners

    • COMPANY_ID(PK)
    • 公司名稱
    • ADRESS
    • TaxId(這可能是PK太)
  3. T_Application

    • COMPANY_ID(FK & PK)
    • User_Id(FK & PK)
+1

你甚至可以將地址移動到它自己的表格中。這將使每個表更小,更高效,它也可以處理重複的地址。 –

+0

我都沒有。 @Joshua Schwarz可能會給你更多的信息。 –

+0

不理解表3.爲什麼使用company_ID和user_id作爲組合PK? – mko

0

假設你跳過表userspartners的創作,你想爲某些用戶更新地址(例如'約翰史密斯')在表3中。在這種情況下,你會寫一些更新查詢。例如像這樣

UPDATE table3 SET address='new address' WHERE FirstName = 'John' AND LastName = 'Smith' 

這種方法需要額外的開銷,因爲如果你有很多表3排它需要很長的時間。此外,如果您有兩個或更多的用戶名爲'John'並且姓'Smith',則很難區分它們。

如果您爲用戶創建單獨的表,那麼管理用戶信息將非常簡單。在這種情況下,你的表格將是標準化的。在所有數據位於同一個表中的很多列的情況下,您有非規範化的表。這種方法有一些優點,但在大多數情況下,您必須正常化您的數據。

對你的問題的簡短回答:有幾列的3個表格比大多數列的大表格更好(在大多數情況下)。

+0

UPDATE table3 SET address ='new address'WHERE applicationID = 3? +用於規範化 – mko

+0

同樣的問題 - 您試圖更新數據,這不屬於'表3'中的實體。這個數據(地址)屬於某個用戶,因爲用戶有一個地址(住在街道上),而不是來自「表3」的實體。當你的數據被標準化時(即表'用戶'存在),你只需要更新'用戶'表中的一行。我希望你明白我想說的) –

+0

換句話說,用戶_own_地址。這就是爲什麼專欄「地址」必須位於「users」表中的原因。我很抱歉我的英語,perhabs有時候我會犯錯誤) –