2012-06-26 24 views
0

我有一个3nf数据库。其中有一系列两张表,这些表是一系列更大的依赖关系的一部分。这两个表格(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 

这些表部分作为一个例子,请参阅下面的一个explination:

表C持有如何使FooBars信息。当制作FooBar时,表B记录了FooBar用于跟踪和质量保证目的的实际方式。一旦创建了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 

的原因是,多个FooBars可以从一个条目表B中提出的,这意味着这种变化可能导致的另一个表在:

Table AB 

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

A)是否有不同的方法我应该使用删除,这样的记录可以被添加到表A这种依赖关系,而不需要满足表B中的外国唱片?

B)是否提示修改会降低查询速度?

回答

4

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

+0

这是我想采取的方法。但是,这需要逻辑来确保查询不是针对空密钥进行的。另外,没有空外键是否违反了参照完整性? –

+0

查询可以针对NULL进行,当然,在你期望的任何可能情况下,任何条件= NULL(哪个结果将会是...... NULL)?不,它没有违反它,它是_helps_处理像你这样的实例的工具。 – Wrikken

+0

尝试从外键为空的包含记录中访问数据将导致异常 - 所以在这种情况下。而且,引用完整性要求所有外键都有一个**有效的**引用。 –

相关问题