2015-12-05 15 views
1

我正在進行數據庫設計,我面臨的情況是,根據三個表中的日誌發送通知,每個日誌包含不同的數據。然後NOTIFICATIONS表應該是指這三個表,而且我認爲有三種可能的設計,每一個似乎都有缺陷在它:表中有n個表中有一個匹配的表的最佳做法是什麼?

  1. 每個日誌表將有一個獨特的遞增ID和NOTIFICATIONS表將有三個不同的列FK的。這個設計中的主要缺陷是我無法創建真正的FK,因爲這三個字段中的兩個字段對於每一行都是NULL,並且查詢將不得不「確定」該行中實際記錄的數據類型。
  2. 日誌表將有一個唯一遞增的ID爲所有他們。然後,當我查詢NOTIFCATIONS時,我可以用這些表做三個OUTER JOINS,每行只有一個匹配。這看起來好像是一個更好的設計,但是我將在每個日誌表中留下空白,並且選項1中的缺陷仍然存在。
  3. 選項1/2 +創建三個通知表而不是一個。此選項將要求應用使用UNION ALL查詢通知。

哪個選項可以更好地練習?我有沒有想過的另一種方式?任何建議將被認真考慮。

+0

爲什麼你不能有3個列中的2個爲NULL? –

+0

我可以有,但因此我無法創建FK(我最終沒有創建)。 –

+0

爲什麼不呢?外鍵允許爲空。 –

回答

0

我最終面臨兩個主要選項:

  1. this answer最後建議。
  2. 爲數據庫選擇一個不太標準化的結構,也就是假的/沒有FK的。準確地說,在我的情況下,這將是我的第二個選擇上面假FK的。

我選擇了選項#2作爲我諮詢的DBA,它啓發了我關於數據庫規範化應該根據可能的結構破壞進行的想法。就我而言,雖然通知是基於日誌創建的,但這些FK對於查詢通知或查詢日誌並不是必需的,應用程序也不必確保這種關係正常運行。因此,以下選項#1可能是「過度標準化」。

非常感謝您的回答和評論。

0

使用一張持有通知ID的表格。三個原始表格中的每一個都將子類型與其FK的通知ID一起保存在該表格中。在數據庫中搜索重新分類/子表。這是一個標準的設計模式/成語。

(有些實體,我們將它們概念化,我們稱之爲組的種類或類型,我們說一個特定的實體,它是一個什麼類型的實體,或者甚至是「是」一個。可以有包含另一個組的所有實體的組,因爲更大的是超小的超集,我們說更大的類型是更小類型的超類型,更小的是更大的子類型)。有一些習慣用法可以用來以聲明方式限制你的表格。主要的是在超類型表中有一個子類型標籤,甚至在子類型表(每個表只有一個標籤值)中也有。

+0

在這種情況下,術語「亞型」究竟意味着什麼? –

0

我有一個解決方案犧牲參照完整性來幫助你實現你想要的。

您可以在所有三個日誌表中保留一個GUID data type作爲主鍵。在Notification表中,您只需添加一個不會指向任何特定表的外鍵列。所以只有你知道它是一個外鍵,SQL Server不是,它不強制引用完整性。在此列中存儲通知的GUID。通知可以在三個日誌中的任何一箇中,但由於所有三個日誌的主鍵都是GUID,所以您可以將該密鑰存儲在Notification表中。

另外,您還可以在Notification表中添加另一列,以確定此GUID屬於哪個日誌。現在,您可以唯一地知道所需日誌表中的哪一行,以便查找此通知信息。


問題是你有三個單獨的日誌表。相反,你應該只有日誌表,它會有一個額外的列指定記錄是什麼它。這樣你就只有一張桌子 - 參照完整性會保持不變,設計也會變得簡單。

+0

感謝您提供有關在通知中添加類型列的建議。我更喜歡三個日誌表的主要原因是我有不同類型的數據記錄(例如,一個日誌狀態更改+原因,另一個日誌簡單文本消息)。因此,某些列與特定的日誌記錄相關,並考慮添加更多類型的日誌記錄的選項,這看起來有點可怕。 –

+0

@NeriaNachum:我覺得你應該重新設計日誌表,並可能將列重命名爲更通用的名稱。例如:名爲「Action」的列將保持狀態更改+爲一個日誌記錄的原因以及另一個日誌記錄的txt消息。如果更合適,可以命名爲「ReasonOrMessage」列,爲什麼不呢? – displayName

相關問題