2013-10-28 49 views
0

我正在處理用戶在不同時間輸入各種數據的數據庫。將空值用作未來數據的佔位符是否是一種好的做法?

目前我有三個表之間的多對多關係。

tblDog:ID,名稱 tblOwner:ID,名稱 tblVet:ID,名稱

tblDog_Owner_Vet:ID,Dog_id,Owner_id,Vet_id

在一個完美的世界裏一個人必須在一個所有信息將所有這三個實體連接在一起的時間,但用戶現在可能會有一些信息,然後再多一些。因此,我讓他們進入它,他們得到的信息,所以條目可能看起來像下面。據我所知,通常一隻狗將只能有一個業主/獸醫,但對於這個問題的緣故,請考慮它可能是一隻狗可以有一個以上的所有者和獸醫:

  • 1,1,1,1
  • 2,2,2,空
  • 3,2,空,3

然後,他們可以稍後再回去,要麼添加缺少的信息或合併該轉出相關兩行。

這是可以做或所有這些空值的問題?是否有另一個解決方案,我可能會失蹤?

回答

0

我只是使用0(零)爲未設置的外鍵列。 在大多數情況下它可能沒有什麼區別,但我喜歡它是一個int類型,並且在應用程序中測試時總是比較簡單。

我剛剛將此添加爲評論,但我還沒有足夠的代表。

0

按照您的建議使用空值有一個巨大的缺點。多對多的關係,或者在你的情況下,多對多使用複合主鍵來唯一標識記錄。如您所知,主鍵列必須聲明爲非空。

解決方法是在所有者和審覈表中記錄「不適用」或「無」或類似的記錄。此外,您需要一個字段,也是主鍵的一部分,在您的多對多表中指示該記錄當前是否爲真。例如,如果您的桌子上有一隻無辜的狗,您可以將「不適用」的值分配給獸醫領域。然後,當小狗得到獸醫時,你添加一條新記錄並更新這條記錄,表明它現在是錯誤的。

編輯從這裏開始

從評論,「我不能剛過寫‘無’與新的獸醫的ID是記錄_id?」。總有不止一種方法可以完成某件事情。更新記錄是一種方法。另一個是刪除「none id」記錄並添加一個新記錄。爲了幫助做出決定,問問自己,你打算如何處理這種情況,即所有者John決定Bloggins博士作爲Fido的獸醫不再受到歡迎。

此外,您沒有擺脫null來保護外鍵約束。你這樣做是因爲vet_id將成爲主鍵的一部分,因此它不能爲空。

+0

謝謝丹。快速提問。爲了保護外鍵約束,我看到擺脫「空」的好處,但是在「真/假」指示中有什麼好處。難道我不能僅僅用新的Vet的id在那個記錄中寫下「none」_id嗎?再次,我可能會錯過一些很好的信息,所以任何幫助表示讚賞! – dwags

+0

外鍵可以是NULL。它只是一個表的主鍵,不能包含任何可爲空的列。我不認爲這是一個問題。 – eggyal

+0

在我看來'tblDog_Owner_Vet.id'是PK。爲什麼你要堅持一個複合PK,它會提出非空要求,這會使OP的填充目標複雜化。 'vet_id'以後? – eggyal

相關問題