2013-07-06 30 views
1

在工作中,進行了審查,它由三列的表:什麼是數據庫表中的最佳實踐與兩列主鍵,其中一列是可選的?

  1. 行ID(NOT NULL,整數)
  2. 上下文ID(NOT NULL,整數)
  3. 值(NOT NULL,可變字符)

行的總數很小(小於100)。如果沒有上下文ID,則上下文ID當前設置爲0。上下文ID是可選的。

主鍵是(行ID,上下文ID)

在這種情況下,有提出兩個選擇:

  1. 保持它,因爲它是

  2. 鴻溝表成兩張桌子。上下文ID爲0時的一個表(行ID,值)和上下文ID有值時的一個表(行ID,上下文ID,值)。

如果有大量的行,那麼我同意分割表的決定。如果有少量的行,分割表似乎是矯枉過正。

我會非常有興趣什麼人建議在這種情況呢?總是把單個表分成兩個表是更好嗎?

感謝,

拉里

+0

我認爲你需要提供更多的背景信息。什麼是「行ID」和「上下文ID」?他們是自然的鑰匙還是代理人?如果他們是代理鍵,我不清楚爲什麼你選擇了一個組合鍵(但這真的取決於其他表如何加入到這張表以及如何使用它)。 – orange

+0

感謝您的檢查。這兩個值都是代理鍵。行編號命名不正確。它應該真的是「財產ID」。它是爲了識別一個屬性,例如名稱。 「上下文ID」旨在爲該屬性指定上下文。因此,一般屬性的上下文ID爲0.例如,對於加利福尼亞州的人來說,只有屬性可以具有「上下文ID」= 1,對於內華達州來說,具有「上下文ID」爲2的屬性。 –

+0

「Context ID」中存儲0的問題到底是什麼?你是否試圖執行一個FOREIGN KEY,並且由於在父表中沒有相應的行,所以0是這樣的? –

回答

2

首先,如果是這樣的實體 - 屬性 - 值反模式,避免這種情況。這個答案的其餘部分假定它不是。

當決定,如果你要榕你需要考慮,如果你的代碼就可以處理一般事情還是需要特殊情況下,一般的東西(單表)或明確(兩個表)的模式。

是特殊情況需要?

將你的代碼給予特殊待遇的0 CONTEXTID?例如,你可以運行一個選擇WHERE ContextId=0,然後繼續以通用的方式查看不同的上下文嗎?是否有特殊的邏輯,你只能用ContextId=0?你會不會覺得在你的代碼中需要一個代表這個contextId的特殊常量?你會不會出現在某些if陳述中?

如果這些問題的答案通常是肯定的,那麼創建單獨的表格。無論如何,如果你對它有不同的處理方式,你將無法將這些東西放在一張表中。

這是我的猜測,這是基於你的問題的情況。

還是全部是通用的?

如果零代碼的ContextId與整個代碼中的所有其他上下文ID一樣被處理,那麼通過所有其他方式將它們與其他代碼放在同一個表中。

權衡

如果事情並不那麼明確,你有一個折衷的決定。您需要根據您對這些信息的使用情況是多少,以及具體情況來確定。我會偏向於創建兩個表。

1

沒有足夠的信息來決定,但:
在數據庫設計的角度來看,參加到minimum side-effect changes,我會選擇增加一個新列的表,稱爲IDsetting it as the Primary Key of the tablehaving a new unique key on (Row Id + Context Id)列。
背後的邏輯(行ID +上下文ID)是你的應用程序邏輯和應用程序邏輯綁定到變化。
它建議使用您的表的主鍵分隔業務標識符和邏輯。 任何領域都向最終用戶展示,面臨被要求更換,維護和發展的風險。
希望有幫助。

相關問題