我正在处理数据层的两个部分。我创建了procs,以及将使用procs的业务对象层。
是否有确定删除位置的最佳做法?
这是场景。我有一个表Book with foreign key to a child table Pages。如果我删除了这本书,我也想删除这些页面。如果删除页面失败,我希望整本书保留(交易)。
是否应该在托管代码中进行删除(通过创建事务,删除所有子对象,最后删除书籍),或者在proc中(再次在事务中)?
或者重要吗?
答案 0 :(得分:2)
有三种方法:
根据你的DAL看起来你必须做出选择。 如果它是一个ORM,那么请选择1.否则请选择3。
答案 1 :(得分:2)
我想说这取决于你存储数据的“逻辑”。
1)如果您的存储过程大多是“哑”的,只需简单的插入/更新/删除。我会将删除数据放在数据层对象中,在那里您将拥有更复杂的代码。
2)如果您编写了许多复杂的存储过程,则需要检查商业规则。将逻辑全部保留在SP中并保持数据层简单。
真的是你想要复杂性的地方。不要在对象和SP中放置太多规则,否则维护将是一个婊子。
答案 2 :(得分:1)
叫我老式,但我总是让数据库做数据库做的事情;让它处理删除并将值返回给调用代码,以指示操作是成功还是失败。
我知道ADO.NET在管理SQL操作方面做得很好但我通常将此限制为配置连接,添加参数然后运行存储过程。
答案 3 :(得分:1)
我的偏好是从托管代码执行子删除。如果从这里完成,则更容易确保所有删除都以相同的方式执行,并且它为另一个开发人员提供了一个容易理解该实体如何工作的地方。
答案 4 :(得分:1)
如果在删除主对象时应始终删除子对象,则最好的位置是在数据库中。从未通过GUI完成的导入或查询可能会发生deltes。想想如果你需要从一个破产的出版商那里推销所有书籍会发生什么。没有人会通过GUI一次做那个。因此,如果级联删除是数据库中的一个选项,则进行设置。如果没有通过触发器进行。
在此之前,要非常确定要删除子对象。您会丢失所需的历史数据吗?通常最好将父记录标记为非活动记录而不是删除它。这样,您就不会丢失图书订单上的历史记录,因为您在图书不再可用时删除了所有子记录。如果您的系统涉及,订购,仓储或财务系统或任何其他系统,其中子表将保存具有日期历史记录并且可能需要在报告中调用或在研究客户呼叫时,您几乎不想删除记录