2012-06-26 29 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

嘗試從外鍵爲空的包含記錄中訪問數據將導致異常 - 所以在這種情況下。而且,引用完整性要求所有外鍵都有一個**有效的**引用。 –

相關問題