我在应用程序中有以下场景。
一个称为结构的实体,另一个称为客户,另一个称为组织。所有这些实体都有可选的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)

三个foreigns键中的一个总是有一个值,另两个总是用空值填充。
寄存器示例:
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建议。但这次讨论是关于正常化的。
我错了,这种方法不正常?或者它是正确的,没有自大的问题?

最佳答案

因为id_结构id_客户id_组织的值依赖于彼此的值,所以它不是标准化的。必须确保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电话所有者。所有实体结构、客户和组织都是所有者,因此为它们添加id_owner字段。每个电话可以由一个所有者拥有,因此也添加一个id_owner字段。
添加新实体(如结构)时,请添加新电话所有者和新结构。当实体获得电话时,将电话的id所有者设置为实体的id所有者。
如果没有关于所有权的其他特定信息(如到期日期)要放入电话所有者表中,则可以忽略电话所有者表,并将实体的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)

关于sql - 多个外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17357875/

10-11 01:41