2012-05-21 232 views
1

我試圖解決一個問題,並具有想出最好的解決辦法一個艱難的時刻。我有一個包含(除其他事項外)以下的東西的表的數據庫:數據庫設計,模擬表的外鍵到多個表

  • 目的地請求
  • 支持請求
  • 交換請求
  • 存款要求

每一種表格有一個註釋列(從最終用戶到管理員),但是我被要求添加註釋到所有這些請求的能力。我希望每一組筆記都是獨立的,以便我可以跟蹤添加筆記的日期/時間以及編輯它的人員。這表明我需要將註釋存儲在表中,並通過外鍵鏈接回請求。問題是每個請求表都有一個自動遞增的id列,該列在該表中是唯一的,但不是唯一的所有其他(即每個表可能有一個ID爲200的請求)。

我認識到一個解決我的問題可能是爲每一個類型的請求「註釋」表並創建相應的外鍵,但肯定不是解決問題的唯一體面的方式。

我真的想知道的是,是否有使用類似的ID和請求類型(表名稱基本)的東西,創建一個外鍵的有效途徑。這可能嗎?

+1

表中是否有共同的任何屬性,除了ID和註釋? – keyser

+0

一般來說,將元數據與真實數據進行存儲是個不錯的主意。將參考表與參考ID一起存儲幾乎不會像多表一樣工作。 – JNK

+0

@Keyser:它們每個都有一個指向User表的外鍵,並且它們每個都有一個RequestDate和RequestStatus(我想他們都有一個RequestID),但除此之外它們存儲了非常不同的數據。 –

回答

3

作爲一個創可貼,你可以做這樣的事情...

enter image description here

...用下面的約束上Note

CHECK (
    (
     「Destination Request Id」 IS NOT NULL 
     AND 「Support Request Id」 IS NULL 
     AND 「Exchange Request Id」 IS NULL 
     AND 「Deposit Request Id」 IS NULL 
    ) 
    OR (
     「Destination Request Id」 IS NULL 
     AND 「Support Request Id」 IS NOT NULL 
     AND 「Exchange Request Id」 IS NULL 
     AND 「Deposit Request Id」 IS NULL 
    ) 
    OR (
     「Destination Request Id」 IS NULL 
     AND 「Support Request Id」 IS NULL 
     AND 「Exchange Request Id」 IS NOT NULL 
     AND 「Deposit Request Id」 IS NULL 
    ) 
    OR (
     「Destination Request Id」 IS NULL 
     AND 「Support Request Id」 IS NULL 
     AND 「Exchange Request Id」 IS NULL 
     AND 「Deposit Request Id」 IS NOT NULL 
    ) 
) 

這樣,你不「T改變現有的表的PK(這可能對模型的休息和客戶端應用程序(一個或多個)級聯效應),但你可以有適當的參照完整性不‘重複’的Notes表。

+0

這似乎是最好的解決方案。 –

1

你可以有一個表注(OBJECT_ID,注),其中OBJECT_ID引用任何請求表。你不必在數據庫中有一個外鍵約束,或者如果你真的想維護一個約束,你可以使用一個約束子句(可能是供應商特定的?)。

要確定筆記與有關其請求表,你可以在注意枚舉類型值。一些數據庫供應商有一個Enum類型,其他的你可能只使用一個Int。它只是一些像request_type枚舉(DESTINATION,SUPPORT等)的列。

如果你的數據庫很小或者可以脫機一段時間,你可以改爲重新創建這些表,以便它們使用一個單一的序列來生成它們所有的四個object_id ......這樣ID就可以在整個不同的請求表。我喜歡在這種情況下擁有一個普遍唯一的object_id序列。

對於一些供應商(postgres),您可以使用表繼承。使用表繼承你可以做一些類似create table destination_request(....)inherits(note);這將使註釋表中的任何字段可用於destination_request表上的查詢。這是在某種意義上的工作,併爲你在幕後工作。從概念上講,請求不是一個子類型的註釋,所以這在OO設計方面並不理想,並且表繼承很可能無法移植到其他數據庫供應商。這取決於你在這裏純粹的關心。

你可以有四個不同的外鍵指向上面建議的每個表,但是留給你一個大多爲空值的表......我可能更喜歡有四個不同的註釋表,值。