2009-02-02 57 views
1

我正在處理數據層的兩個部分。我開始創建特效,以及將消耗特效的業務對象層。我應該從客戶端還是通過存儲過程刪除子對象

是否有確定刪除應該發生的最佳做法?

這裏是場景。我有一張表用外鍵將一個子表關聯到一個子表頁面。如果我刪除這本書,我也想刪除這些頁面。如果刪除頁面失敗,我希望整本書留下來(交易)。

刪除應該發生在託管代碼中(通過創建一個事務,刪除所有的子對象,最後刪除這本書),還是在proc中(再次在事務中)?

還是有關係?

+0

你忘記了級聯選項。 – 2009-02-02 20:57:42

回答

2

我會說這取決於你存儲數據的「邏輯」。

1)如果你的存儲過程大多是「簡單」的插入/更新/刪除的「啞」。我會把刪除放在數據層對象中,你會有更復雜的代碼。

2)如果你已經寫了很多複雜的存儲過程,你需要檢查商業規則。將邏輯全部保留在SP中並保持數據層簡單。

真的是你想要說謊的複雜性。不要把太多的規則放在對象和SP中,否則維護將會成爲婊子。

2

以及有此3種方式:

  1. 用的TransactionScope做它在應用
  2. 做在proc
  3. 創建級聯的PK-FK關係刪除。

取決於您的DAL看起來像您必須做出選擇。 如果它是一個ORM,那麼去1。否則去3.

1

打電話給我老式的,但我總是讓數據庫做數據庫做什麼;讓它處理刪除操作並將值返回給調用代碼以指示操作的成功或失敗。

我知道ADO.NET在管理SQL操作方面做得很好,但我通常將其限制爲配置連接,添加參數並運行存儲過程。

1

我的首選項是從託管代碼執行子刪除操作。如果從這裏完成所有刪除操作,則確保所有刪除操作都是相同的,並且爲另一位開發人員提供了一個便於理解該實體如何工作的便利位置。

1

如果在刪除主對象時應始終刪除子對象,那麼最好的做法是在數據庫中。從導入或查詢中可能會發生deltes,而這些deltes不是通過GUI完成的。想一想,如果你需要從出版社倒閉的所有書籍,會發生什麼。沒有人會通過圖形用戶界面一次完成一個。因此,如果級聯刪除是數據庫中的一個選項,請設置它。如果不通過觸發器。

在做這件事之前,要非常確定要刪除子對象。你會失去你需要的歷史數據嗎?通常最好將父記錄標記爲不活動,而不是刪除它。這樣您就不會失去訂單上的歷史記錄,因爲您在書籍不再可用時刪除了所有的子記錄。如果您的系統涉及,訂購,倉儲或財務系統或任何其他系統,子表格可能存放具有日期歷史記錄並且可能需要在報告中調用或調查客戶呼叫的記錄,則幾乎不會刪除該記錄。

相關問題