在我的应用程序中,我有一个Customer
类和一个Address
类.该Customer
班有三个实例Address
类:customerAddress
,deliveryAddress
,invoiceAddress
.
什么是在数据库中反映这种结构的最佳方法?
直接的方式是客户表和单独的地址表.
更加非规范化的方式只是一个客户表,每个地址都有列("street"的示例:customer_street,delivery_street,invoice_street)
你有什么经历?这些方法有什么优点和缺点吗?
如果您100%确定客户将只拥有您描述的3个地址,那么这是可以的:
CREATE TABLE Customer ( ID int not null IDENTITY(1,1) PRIMARY KEY, Name varchar(60) not null, customerAddress int not null CONSTRAINT FK_Address1_AddressID FOREIGN KEY References Address(ID), deliveryAddress int null CONSTRAINT FK_Address2_AddressID FOREIGN KEY References Address(ID), invoiceAddress int null CONSTRAINT FK_Address3_AddressID FOREIGN KEY References Address(ID), -- etc ) CREATE TABLE Address ( ID int not null IDENTITY(1,1) PRIMARY KEY, Street varchar(120) not null -- etc )
否则我会像这样建模:
CREATE TABLE Customer ( ID int not null IDENTITY(1,1) PRIMARY KEY, Name varchar(60) not null -- etc ) CREATE TABLE Address ( ID int not null IDENTITY(1,1) PRIMARY KEY, CustomerID int not null CONSTRAINT FK_Customer_CustomerID FOREIGN KEY References Customer(ID), Street varchar(120) not null, AddressType int not null -- etc )
我将(作为数据库理论教导)用于两个单独的表:Customer和Address.
正如您所说,将三个字段放在Customer表中的想法很糟糕,因为它会违反规范化规则(并且当地址变为三个以上时会失败).
编辑:另外,我将地址表记录分成几个字段,一个用于地名前缀,一个用于街道等,并在其中放置一个唯一的密钥.否则,您将以一个完整的重复数据库结束.