繁体   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