Dan*_*ski 12 database language-agnostic oop database-design
在我的应用程序中,我有一个Customer类和一个Address类.该Customer班有三个实例Address类:customerAddress,deliveryAddress,invoiceAddress.
什么是在数据库中反映这种结构的最佳方法?
你有什么经历?这些方法有什么优点和缺点吗?
Mit*_*eat 11
如果您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
)
Run Code Online (Sandbox Code Playgroud)
否则我会像这样建模:
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
)
Run Code Online (Sandbox Code Playgroud)
我将(作为数据库理论教导)用于两个单独的表:Customer和Address.
正如您所说,将三个字段放在Customer表中的想法很糟糕,因为它会违反规范化规则(并且当地址变为三个以上时会失败).
编辑:另外,我将地址表记录分成几个字段,一个用于地名前缀,一个用于街道等,并在其中放置一个唯一的密钥.否则,您将以一个完整的重复数据库结束.
我会去规范化。这更容易。
如果对其进行规范化,地址表将要求您从客户表中删除重复项并重新链接记录。如果我有相同的送货地址和发票地址,它似乎应该链接到相同的记录。如果我换一个,你需要:
如果我把它改回来,你需要检查:
这种编程开销似乎消除了规范化似乎提供的更少空间的优势。正如您所指出的,非规范化解决方案将提供更快的查询和更轻松的维护(编程方面)。这对我来说似乎是决定性因素。
如上所述,规范化的解决方案将允许您稍后添加更多地址。但是无论如何您都必须为外键添加一个字段,除非您计划在没有从客户到地址表的链接的情况下组织表。
归一化的优点
非规范化的优点