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