2011-03-29 88 views
0

我正在VB.NET中開發一個「AddressBook」項目。在SQL Server2005中開發數據庫時,我想遵循規範化原則並儘可能保持其規範化程度。數據庫設計和規範化

我正在使用的字段是這些。

Create table AddressBook_Contact 
(
Contact_ID int Primary Key,FirstName varchar(15),MiddleName varchar(15),LastName varchar(15),BirthDay datetime,HomeCountry varchar(20),HomeState varchar(20),HomeCity varchar(20),HomeMobile varchar(40),HomePhone varchar(40),HomeMobile varchar(40),HomeFax varchar(40),HomeZipCode varchar(10),HomeEmail varchar(50),HomeAddress text, 
BusIndustry varchar(20),BusCompany varchar(20),BusWebsite varchar (30),BusCountry varchar(20),BusState varchar(20),BusCity varchar(20),BusMobile varchar(40),BusPhone varchar(40),BusFax varchar(40),BusZipCode varchar(10),BusEmail varchar(50), 
BusAddress text,Note text 
) 

如果我在一個表中創建所有的字段..它反對規範化?如果由於時間的規模大幅增加而變得緩慢,對桌子的影響是什麼。

如果我創建聯繫(生物數據,HomeInfo,的BusinessInfo)單獨的表

create table AddressBook_Bio 
(
BookID int Primary Key, 
Title varchar(15), 
FirstName varchar(15), 
SecondName varchar(15), 
LastName varchar(15), 
BirthDay datetime, 
Note text 
) 

create table AddressBook_Home 
(
'My question in this case is should i declare BookID as foreign key or primary key to the table and why?' 
FOREIGN KEY (BookID) REFERENCES AddressBook_ContactBio(BookID), 
HCountry varchar(20), 
HState varchar(20), 
HCity varchar(20), 
HMobile varchar(40), 
HPhone varchar(40), 
HFax varchar(40), 
HZipCode varchar(10), 
HEmail varchar(50), 
HAddress text 
) 

create table AddressBook_Business 
(
same issue as "AddressBook_Home" 
) 

感謝關懷,以表達並分享您的意見,知識。

回答

0

是的,我相信你想創建的大表沒有被標準化。它可能具有的影響是,您可以在表中使用NULL值,這會浪費空間。

我想你會希望將BookID聲明爲主鍵,因爲它似乎是該表的唯一鍵,每個表都給出了一個人的不同信息。這將與部分重疊的子類相似。

+0

這種解決方案看起來很公平...但它使編碼有點困難,但真的保險箱空間..我會去這個..謝謝 – Saqib 2011-03-31 07:15:29

+0

@Saqib好吧!你也可以接受這個答案:) – TheDude 2011-03-31 14:59:58

0

如果只有一個家庭住址和一個商務地址,那麼第一個結構並不真正「反對規範化」 - 它表示數據的結構。

如果您想要允許多個地址(1,2或更多,甚至爲零),您應該創建一個單獨的地址表(可能帶有「類型」列,表示它是家庭,企業還是其他地址)。

你給出的兩個幾乎相同的地址表的想法似乎是一種不好的方法,因爲一張表就足夠了,而且你不需要複製和粘貼兩張相同的表。

如果您創建地址表,它應該將BookID作爲外鍵,並且它也應該有自己的獨立主鍵。

您想知道BookID是否應該是* _Address表中的主鍵,這一事實表明您實際上應該將事物拆分爲2個表格。

0

總是可以實現的最高標準形式是6NF。簡而言之,6NF中的表將具有一個鍵(可以包括多個列)以及至多一個附加屬性(注意,該屬性可以具有每個都具有其自己列的子原子元素,例如地址具有子原子元素zipcode,州,國家,等等)。因此,至少你應該爲Note,HMobile,HPHone,HFax,HEmail和Note創建不同的表格,如果它不是一個鍵的一部分(我會推測它是這樣),可能是BirthDate。

+0

不確定你的意思是「亞原子元素」。你在談論關係值屬性/嵌套表嗎? – sqlvogel 2011-03-30 07:17:12

+0

這裏有很好的信息,但是OP的矯枉過正,時間很長。 – Dane 2011-03-30 09:10:14

+0

@dportas:考慮'EmployeeNames',其中包含'employee_number','family_name'和'given_name'的屬性。我認爲這是在6NF中,因爲'family_name'和'given_name'是元素'employee_name'的兩個亞原子粒子(Celko使用這個詞組),通常爲實際目的存儲分割部分。 – onedaywhen 2011-03-30 09:15:50