2010-02-20 39 views
0

標題可能有點誤導,因爲我真的不知道該怎麼稱呼它。 Here是我的dbml,我使用存儲庫模式在我的應用程序層和我的SQL層之間進行通信。正如你所看到的,我有四張桌子。其中三人有一個外鍵給ContactId。我使用這種方法,因爲我需要存儲一個「數組」,所以我做了幾個表。所以現在我想知道如何製作,以便我可以將電子郵件地址,電話號碼或地址「添加」到聯繫人,並通過聯繫人進行操作。使用主鍵更新SQL Server中的外部表

回答

2

「明顯」的答案是有一個Contact類,它有addEmail,addPhone和addAddress方法,再加上數據庫中的匹配存儲過程。你的問題還有更多嗎?

此外,雖然這不是直接問題的一部分,但您可能需要考慮標準化設計。處理這些類型事物的典型方法是使用一對多表格。例如,您的電子郵件地址表是這樣的:

EmailId (int - PK) 
ContactId (int - FK to Contact) 
EmailAddress (varchar) 

或可能:

ContactId (int - FK) 
EmailNumber (tinyint? sequential 1, 2, 3, ...) 
EmailAddress (varchar) 

與PK是的ContactID和EmailNumber

無論哪種方式,每行存儲一個電子郵件地址。這應該會使添加或刪除單個電子郵件變得更加容易,並且會消除當前設計中三個電子郵件的限制。它還使添加有關每個電子郵件地址的附加信息變得更加容易。例如,它是一個家庭或工作地址。或者,該電子郵件地址是否有效。

0

如果你想要一個完全規範化的設計,那麼你應該有類似

Create Table dbo.Contacts 
(
    Id int not null Primary Key Clustered 
    , FirstName nvarchar(25) null 
    ... 
) 

Create Table dbo.ContactAddresses 
(
    Id int not null Primary Key Clustered 
    , ContactId int not null 
    , Street nvarchar(max) null 
    , City nvarchar(40) null 
    ... 
    , Constraint FK_ContactAddresses_Contacts 
     Foreign Key (ContactId) 
     References dbo.Contacts(Id) 
) 

Create Table dbo.ContactEmail 
(
    Id int not null Primary Key Clustered 
    , ContactId int not null 
    , Type nvarchar(10) not null 
    , Address nvarchar(255) not null 
    ... 
    , Constraint CK_ContactEmail_Type Check Type In('Primary','Secondary',...) 
    , Constraint UK_ContactEmail_Address Unique (ContactId, Type, Address) 
    , Constraint FK_ContactEmail_Contacts 
     Foreign Key (ContactId) 
     References dbo.Contacts(Id) 
) 

Create Table dbo.ContactPhone 
(
    Id int not null Primary Key Clustered 
    , ContactId int not null 
    , Type nvarchar(10) not null 
    , Number varchar(20) not null 
    ... 
    , Constraint UK_ContactPhone Unique (ContactId, Type, Number) 
    , Constraint CK_ContactPhone_Type Check Type In('Office','Fax','Home',...'Mobile') 
    , Constraint FK_ContactPhone_Contacts 
     Foreign Key (ContactId) 
     References dbo.Contacts(Id) 
)

如果你想在電子郵件或電話類型的更多控制列表,你可以添加一個父表和外鍵存儲他們。這種設計缺少的是防止地址欺騙。用戶是否需要輸入完整的地址?這種設計允許無限的電子郵件,電話號碼和地址。但是,這可能是你所需要的矯枉過正。

如果您正在設計一個完整的聯繫人管理器來替換Outlook之類的東西,那麼上面的設計就是要走的路。但是,大多數捕獲一些聯繫數據的系統並不意味着要成爲完整的聯繫人管理人員。如果是這樣的話,那麼你應該對你將捕獲的數據量做一些合理的限制。例如,您是否真的允許用戶爲單個聯繫人輸入八個電話號碼? 99%的聯繫人只有兩個或三個電話號碼可能更現實。在聯繫人中爲想要捕獲數百個電話號碼和電子郵件地址的人添加一個nvarchar(最大)備註列。如果是這樣的話,那麼你就可以進行非規範化設計了一下:

Create Table dbo.Contacts 
(
    Id int not null Primary Key Clustered 
    , FirstName nvarchar(25) null 
    ... 
    , PrimaryEmailAddress nvarchar(255) null 
    , SecondaryEmailAddress nvarchar(255) null 
    , OfficePhone nvarchar(25) null 
    , MobilePhone nvarchar(25) null 
    , FaxPhone nvarchar(25) null 
    , Note nvarchar(max) null 
    ... 
    , Constraint UK_Contacts Unique (FirstName....) 
)

你必須在這一點上唯一的問題方面地址。在開始之前,如果管理層說「嗨,我們想存儲五個電話號碼」,您應該告訴他們該系統不是Outlook的替代品。如果用戶想存儲比您提供的更多的電話號碼,請將其放入備註欄中。使用地址,您需要知道您需要存儲多少個地址。如果它超過兩個(甚至一個),我的建議將仍然放在一個單獨的表格中。

靈活性與複雜性相關1:1。管理無限數量的電子郵件地址,電話號碼和地址更加靈活,但在用戶界面中添加了更多工作。大多數聯繫人捕獲設計並不需要捕獲給定聯繫人的數十個電子郵件地址,因此完全標準化的設計只需添加比必要的更多的工作。