簡體   English   中英

在哪里放置默認值和唯一約束,代碼或SQL Server?

[英]Where to put default values and unique constraints, code or SQL server?

我們正在設計一個新的數據庫,我想在哪里輸入默認值之類的東西。 有3種情況:

1:新值created_date字段。 插入時該列是否應具有默認值?

2:更新值,updated_date字段。 我一直在考慮實現將其設置為getdate()的觸發器,其他選項在代碼中。

3:使用country_name的country表,我們應該直接在表上強制執行唯一約束還是確保代碼這樣做?

最后一個主題,但是每個表中都有一個update_by和created_by(int),它引用用戶表中的user_id。 實施此功能值得嗎? 所有表的約束?

我的最佳做法:

  • 對於創建/最后更新的日期,取決於您是否要將它們用作業務邏輯的一部分-如果它們僅用於審計,請在數據庫上使用時間戳。 如果有可能您希望將它們公開為業務屬性,則應在代碼中分配它們。

  • 獨特的約束-我在數據庫和代碼中都實現了它們。 這是數據庫備份驗證規則的一個示例,在兩個地方都定義它們並沒有什么壞處。 代碼定義應該捕獲並處理它們,但是如果代碼無法捕獲某些東西,您希望有約束的安全網來防止數據被破壞。

  1. created_date,updated_date :如果這些純粹是審計列,則顯示所做的更改以及由誰進行的更改-觸發器是適當的。 如果您的數據模型依賴於這些模型(也許最后更新日期為最新的記錄),則您的應用程序應該這樣做。 然后,您的應用程序可以決定當前應該是什么,而不是將其硬編碼到“根據服務器當前時鍾設置,最后插入的記錄”架構中。

  2. 國家/地區表 :是,請使用唯一約束。 沒有它,您的數據(以及您的查詢)將變得毫無意義……您將獲得意外的聯接匹配,並且您將無法強制執行參照完整性。 然后,您的應用程序也可以可靠地依賴於它的唯一名稱(例如,通過將它們存儲在SortedList中)。

  3. 用戶表的外鍵是。 如果首先需要保存數據,則有必要確保數據有效。

約束必須至少進入數據庫。 如果您必須在代碼中復制它們(或從數據庫中推斷它們)以提供更好的用戶體驗,那就這樣吧。

數據庫必須一致。 我浪費了太多時間來查找“無效數據”導致的問題。

通過添加適當的約束並修復任何應用程序創建的無效數據,可以解決這些問題。 我寧願擁有10張票證,因為某人無法保存發票(易於追蹤),而不是一張票證,因為某種程度上報告由於錯誤的發票數據而產生了奇怪的價值。

盡可能將其放入數據庫中。 如有必要,您仍然可以從應用程序中操作/查看,但這對數據完整性和將來的應用程序版本都有幫助(即,您不必再復制“ Web應用程序”版本的邏輯)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM