簡體   English   中英

我應該從客戶端還是通過存儲的proc刪除子對象

[英]Should I delete child objects from the client, or via a stored proc

我正在數據層的兩個部分上工作。 我創建了proc,並創建了將使用proc的業務對象層。

是否有最佳實踐來確定應該在哪里刪除?

這是場景。 我有一個帶有外鍵的子表的子表。 如果我刪除這本書,我也想刪除這些頁面。 如果刪除頁面失敗,我希望整本書保留(事務)。

刪除應該發生在托管代碼中(通過創建事務,刪除所有子對象並最終刪除書籍)還是在proc中(再次在事務中)?

還是有關系嗎?

那么有3種方法可以實現:

  1. 使用TransactionScope在應用程式中完成
  2. 在過程中做
  3. 在PK-FK關系上創建級聯刪除。

根據您的DAL外觀,您必須做出選擇。 如果是ORM,則選擇1.,否則選擇3.。

我會說這取決於您將數據的“邏輯”存儲在何處。

1)如果您的存儲過程大多是“啞”的,則帶有簡單的插入/更新/刪除操作。 我會將刪除內容放在數據層對象中,在該對象中您將擁有更復雜的代碼。

2)如果您編寫了許多復雜的存儲過程,則需要檢查biz規則。 將邏輯全部保留在SP中,並使數據層保持簡單。

確實是您想要復雜性所在的地方。 不要在對象和SP中都放置太多規則,否則維護會很麻煩。

稱我為老式,但我總是讓數據庫執行數據庫的工作; 讓它負責刪除操作,並向調用代碼返回一個值,以指示操作是成功還是失敗。

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

我的首選是從托管代碼執行子級刪除。 如果從此處進行刪除,則確保所有刪除操作均相同會更容易,並且這為另一位開發人員提供了一個輕松的地方來了解此實體的工作方式。

如果在刪除主對象時始終應刪除子對象,則最好的位置是在數據庫中。 有些導入可能會因未通過GUI完成導入或查詢而發生變化。 想一想,如果您需要從停業的出版商那里刪除所有書籍,那會發生什么。 沒有人會一次通過GUI做到這一點。 因此,如果級聯刪除是數據庫中的一個選項,則進行設置。 如果不是,則通過觸發器進行操作。

但是,在執行此操作之前,請務必確保要刪除子對象。 您會丟失所需的歷史數據嗎? 通常,將父記錄標記為不活動比刪除它更好。 這樣,您就不會丟失圖書訂單上的歷史記錄,因為當圖書不再可用時,您會刪除所有子記錄。 如果您的系統涉及訂購,倉儲或財務系統,或者子表將保存具有日期歷史記錄且可能需要在報告中或在研究客戶呼叫時調用的任何其他系統,則幾乎永遠不希望刪除記錄。

暫無
暫無

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

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