2011-03-29 86 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