如何抽象或删除此依赖项

时间:2012-06-26 19:44:04

标签: mysql database normalization

我有一个3nf db。在其中,有一系列两个表,它们是更大的依赖链的一部分。这两个表(A和B)给我提出了执行参照完整性的问题。

Table A
int AId //primary key
string Name
date Date
int BId //foreign key

Table B
int BId //primary key
string Name
string Description
int CId //foreign key

Table C
int CId
string HowTo

这些表是部分的例子,请参阅下面的探索:

表C包含有关如何制作FooBars的信息。当制作FooBar时,表B记录了FooBar用于跟踪和QA目的的实际方式。一旦制作了FooBar,并在表B中填写了如何填写它的数据,表A将通过外键BId保存新的FooBar以及表B中的信息。

我的问题是这个,有时作为一个边远的情况,FooBar需要能够在没有的情况下进入系统(基本上作为导入)。但是,由于设计不佳,如果没有(在本例中)表B中的相关条目以确保表A中的外键有效且不破坏参照完整性,则无法实现。

我想要的方法是在A和B之间放置另一张桌子。

Table AB
int ABId //primary key
int BId //foreign key
int AId //foreign key

原因是可以从表B中的一个条目制作多个FooBar,这意味着此更改可能会导致:

Table AB

ABId  BId  AId
1     2    6
2     2    7
3     2    8
4     3    9
5     3    10

A)是否存在不同的方法我应该使用它来删除此依赖关系,以便可以将记录添加到表A而无需满足表B中的外部记录?

B)建议更改是否会减慢查询速度?

1 个答案:

答案 0 :(得分:4)

只需让A.BId能够包含NULL,并将其设置为B-less A的那个。 NULL不参与外键。