2010-07-15 65 views
1

這更多的是當前的好奇心,但讓我們來描述一個環境,我在堅硬的鎳鑰匙&硬幣基礎上開具賬單。我的系統有很多操作,他們都是可計費的。所有這些操作都記錄在各種表格中(這些表格需要分開記錄,因爲它們記錄的信息非常不同)。我也想微觀管理我的應收賬款。 (請原諒我,如果你發現這裏有不一致的地方,因爲這個例子不是真實的情況)列與(許多可能的表之一)之間的SQL參考完整性

是否有某種標準的方式替換外鍵的東西,可以驗證我的結算表中第X列的標識符是在許多操作記錄表之一中存在標識符?

一個想法是,在記帳帳戶活動時,我可以引用操作的標識符以及操作(特別是它所在的表)並使用CHECK約束。這可能是最好的方式,以便我的日記不含糊。

還有其他方法可以解決這個問題,事實上的還是專有的?

非關係數據庫能解決這個問題嗎?

編輯:

要改寫我最初的問題,

有沒有可以驗證列X標識上我的計費表是用什麼代替外鍵的有些標準方法現有的許多標識符中的一個(,但不一定全是)操作記錄表?

+0

什麼你所描述的是** **正是一個外鍵的整點 - 所以要避免通過各種手段,爲什麼?不,沒有其他選擇 - 外鍵就是爲了這個目的而設計的 - 使用它們! – 2010-07-16 16:04:10

回答

3

不,沒有辦法用一個外鍵列實現這一點。

你可以做基本的兩兩件事之一:

  • 在你的表,可能引用任何其他X表,有X外鍵引用的字段(理想情況下:INT型的ID),唯一的一個這在任何給定時間都將是非空的。每個FK參考鍵引用的其他數據表

或只有一個:

  • 有每個主表中的一個「子」表,適當和執行基準,將數據從那些-n下拉在一起子表格轉換爲視圖(而不是表格)以用於報告/結算。

或者只是完全忘記了參照完整性 - 我肯定會不是推薦!

+0

我同意你所說的,除了我正在尋求替代外鍵來檢查完整性。雖然OMG Ponies告訴我說不能用CHECK完成所以現在我現在完全處於虧損狀態。我真的不想添加幾十個可空的FK列來滿足所有可能的操作。 – andyortlieb 2010-07-15 21:24:02

1

另一種方法是通過觸發器強制執行複雜的參照完整性規則。然而,並不確切知道你的設計是什麼,通常當這些類型的問題被問到時,就是要解決一個糟糕的設計。首先查看設計,看看是否可以通過FK來處理這些內容,然後通過觸發器來處理這類事情。

如果你確實走了觸發路線,不要忘記強制更新和插入,並確保你的觸發器可以在基於集合的多行插入和更新的情況下正常工作。

一個設計替代方案是有一個amaster表,它是您的所有表的父表,具有不同的詳細信息,並使用FK。