2

我在应用程序中有以下场景。

一个实体称为 Structure ,另一个称为 Customer ,另一个称为 Organization 。所有这些实体都有可选的 0->N 电话,所以,我创建了 4 个表

Structure 
ID_STRUCTURE (PK)
NAME VARCHAR

Customer
ID_CUSTOMER (PK)
RGI VARCHAR

Organization
ID_ORGANIZATION (PK)
ALIAS VARCHAR

Telephone
ID_TELEPHONE
NUMBER
ID_STRUCTURE (FK)
ID_CUSTOMER (FK)
ID_ORGANIZATION (FK)

三个外键中的一个总是有一个值,另外两个总是用 null 填充。

注册示例:

ID_TELEPHONE NUMBER ID_STRUCTURE ID_COSTUMER ID_ORGANIZATION
      1       1234        1         null         null
      2       4322        null       1           null 
      3       4333        null      null         2
      4       4233        null      null         2    

我的 DBA 说这是一种错误的方法(并且它没有被规范化)并建议 N:N 表来避免这种可空值 fk 。但是业务规则不允许 N:N 建议。但是这个讨论是关于规范化的。

我错了,这种方法没有标准化?或者它是正确的并且没有概念问题?

4

1 回答 1

2

它没有标准化,因为 ID_STRUCTURE ID_COSTUMER ID_ORGANIZATION 的值取决于彼此的值。您必须确保 3 个属性中只有一个不为空。而且它浪费空间来存储空值。

你可以试试这个方法

TelephoneOwner
ID_Owner (PK)

Telephone
ID_TELEPHONE
NUMBER
ID_Owner (FK)

Structure 
ID_STRUCTURE (PK)
ID_Owner (FK)

Customer
ID_CUSTOMER (PK)
ID_Owner (FK)

Organization
ID_ORGANIZATION (PK)
ID_Owner (FK)

添加一个新的 talbe TelephoneOwner。所有实体结构、客户和组织都是所有者,因此为它们添加 ID_Owner 字段。每部电话都可以由一个所有者拥有,因此也要添加一个 ID_Owner 字段。

当您添加一个新实体(例如 Structure)时,请添加一个新的 TelephoneOwner 和一个新的 Structure。当实体获得电话时,将电话的 ID_Owner 设置为实体的 ID_Owner。

如果没有关于所有权的其他特定信息,例如到期日期,放入 TelephoneOwner 表中,您可以忽略 TelephoneOwner 表,并将实体的 ID_Owner 字段替换为 ID_TELEPHONE。

Telephone
ID_TELEPHONE
NUMBER

Structure 
ID_STRUCTURE (PK)
ID_TELEPHONE (FK)

Customer
ID_CUSTOMER (PK)
ID_TELEPHONE (FK)

Organization
ID_ORGANIZATION (PK)
ID_TELEPHONE (FK)
于 2013-06-28T06:29:49.230 回答