一个表中或单独表中的三个客户地址?

Dan*_*ski 12 database language-agnostic oop database-design

在我的应用程序中,我有一个Customer类和一个Address类.该Customer班有三个实例Address类:customerAddress,deliveryAddress,invoiceAddress.

什么是在数据库中反映这种结构的最佳方法?

  • 直接的方式是客户表和单独的地址表.
  • 更加非规范化的方式只是一个客户表,每个地址都有列("street"的示例:customer_street,delivery_street,invoice_street)

你有什么经历?这些方法有什么优点和缺点吗?

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)


Gab*_*ona 5

我将(作为数据库理论教导)用于两个单独的表:Customer和Address.

正如您所说,将三个字段放在Customer表中的想法很糟糕,因为它会违反规范化规则(并且当地址变为三个以上时会失败).

编辑:另外,我将地址表记录分成几个字段,一个用于地名前缀,一个用于街道等,并在其中放置一个唯一的密钥.否则,您将以一个完整的重复数据库结束.

  • 不能记住所有5个标准化级别,但客户表中的三个地址字段意味着(1)DB中的空间浪费和(2)三个地址的限制.单独的地址表可以删除这两个问题. (2认同)

Ste*_*Mai 5

我会去规范化。这更容易。

如果对其进行规范化,地址表将要求您从客户表中删除重复项并重新链接记录。如果我有相同的送货地址和发票地址,它似乎应该链接到相同的记录。如果我换一个,你需要:

  1. 创建新的地址记录。
  2. 重新链接客户记录。

如果我把它改回来,你需要检查:

  1. 是否已存在类似的地址条目。
  2. 重新链接客户记录。

这种编程开销似乎消除了规范化似乎提供的更少空间的优势。正如您所指出的,非规范化解决方案将提供更快的查询和更轻松的维护(编程方面)。这对我来说似乎是决定性因素。

如上所述,规范化的解决方案将允许您稍后添加更多地址。但是无论如何您都必须为外键添加一个字段,除非您计划在没有从客户到地址表的链接的情况下组织表。

归一化的优点

  • 更小的空间。
  • 有点内置的重复逻辑(尽管也许它们实际上不是重复的?)
  • 支持添加新的地址字段(有点)。

非规范化的优点

  • 更快的查询。
  • 少编程。