2010-07-12 66 views
2

爲整數類字段提供默認值總是一個好習慣嗎?我使用linq進行數據庫訪問。SQL數據庫設計中的默認值

+0

說我有一個int字段,不會LINQ自動將它設置爲0即使我沒有具體的值? – Comma 2010-07-12 21:04:24

+0

將int字段自動設置爲0是非常糟糕的做法。 – HLGEM 2010-07-13 13:27:40

回答

2

我假設你正在使用linq-to-sql(即使問題僅標記爲linq)。

我肯定會反對在數據庫中使用默認值。 linq-to-sql層(至少如果使用sqlmetal生成,我假設它與設計者相同)不會使用數據庫中的默認值,而是使用C#類型的默認值 - 這意味着數字爲0類型。在這種情況下,具有代碼不尊重的默認值只會導致混淆。

2

這是一個好主意,如果這些字段是必須有一定的價值,並且默認有意義的。例如,名爲personAge的字段可能沒有意義(默認情況下,您是否可以合理地假設您的所有person記錄都具有相同的年齡,除非他們另有說明?)。讓它爲空可能更好,然後在丟失數據時處理錯誤。

6

只有當它有意義時才應該提供默認值,即。當一個字段應該有一個特定的值,如果你沒有明確指定,否則。例如。 「創建」日期時間字段應具有GetDate()默認值,但「生日」字段應該沒有默認值。最好將字段設置爲NULLable並將其設置爲NULL,而不是使用默認值,這是毫無意義的。

在選擇默認值時,字段的類型無關緊要。

+0

由於阻抗不匹配,這很重要。值類型不能爲空,因此您需要選擇一個「類似於空值」的值(-1或0,DateTime.MinValue等)。只要你在你的代碼中這樣做,你也可以將它作爲數據庫中的默認值並保存一堆空的檢查。雖然,這不是一個問題,因爲C#有可空類型。 – 2010-07-12 21:07:05

3

數據庫中的缺省值是一把雙刃劍。他們可以通過刪除顯式設置值來創建記錄的需要來使生活更加便利。一旦它們建立起來,如果需要改變這些值,就很難追蹤這些值的依賴關係。出於這個原因,我擺脫了數據庫中的默認設置。

0

數據庫中的缺省值可能需要確保所有記錄在字段不包含且不應允許爲空值時獲取值。有時,當字段從可空或不可空時改變爲提供現有記錄的值時,可以添加默認值。也就是說,默認值只應用於有意義的情況。 RecordCreatedDate的默認值是有意義的,那麼你知道它會填充是否應用程序知道填寫字段。訂單中項目數量的缺省值沒有意義,如果未填充,則應嚮應用程序返回錯誤。

使用缺省值避免在適用空值時出現空值是非常差的在我看來實踐。如果你不知道應該是什麼,那麼將整數特別設置爲默認值0是愚蠢和短視的,因爲可能有實際的0值。 Null意味着未知數據,如果數據在數據輸入時不能被預知,那麼使列不能爲空並將其放入默認值(尤其是整數和日期)是非常糟糕的做法。現在,您不知道該值是否真正爲零或只有佔位符,直到您知道該值。現在你必須編寫特殊的規則來適應假的價值(特別是如果你把某個假的價值放在'19000101'之類的日期)。切勿在數據庫中使用默認值,以避免使用可爲空的列。

+0

即使將列更改爲NOT NULL,也不需要缺省值。只要你保證表中沒有行違反新約束,SQL Server就會允許你添加它。 – 2010-07-12 21:22:43

+0

我沒有說他們是必要的,只是他們用於這個目的,他們往往是。 – HLGEM 2010-07-13 13:30:37