2013-06-28 68 views
2

我在应用程序中有以下情况。多个外键

称为结构的实体,另一个称为客户,另一个称为组织。所有这些实体具有可选0->ñ电话,所以,我创建了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) 

一次为期夷键总是有一个值,另外两个总是充满了空。

寄存器例如:

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说,这是一种错误的做法(这不是归一化)和sugest N:N表来避免这种nullables FK。但业务规则不允许N:N建议。但是这是关于正常化的讨论。

我错了,这种方法没有正常化?或者这是正确的,没有任何问题?

+0

当您有2个客户使用同一个电话时会发生什么? –

+0

号码是唯一的,不会在整个表格中重复。 – jlemes

回答

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字段。

当您添加一个新的实体(如结构)时,添加一个新的TelephoneOwner和一个新的结构。当实体接到电话时,将电话的ID_Owner设置为实体的ID_Owner。

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

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) 
+0

第一个解决方案很好,但是一个问题。总是我会有一个只有一列的表,用于解决这些外键空值的问题?听起来对我来说很奇怪。第二个例子失败,因为力模型是1:1,关系是0:N可选否? – jlemes

+0

如果您有其他所有权信息,例如所有权何时开始以及所有权何时结束,那么TelephoneOwner表将不会只有一列。否则,第二个模型解决了一列问题。它是否因为你的数据库管理系统不允许它或你的数据库管理员说它是错的而失败?当TelephoneOwner表被合并到电话表中时,这两个模型不一样吗? – Haoshu

+0

秒结束可能有0个或多个电话,因为强制模型为1:1会失败。客户可以有0个或多个电话。组织可以有0个或多个电话。结构不能像其他实体客户和组织一样重复自己。现在明白了 ?我用更多的栏目编辑我的问题 – jlemes