存储过程的业务逻辑

时间:2010-12-21 00:43:56

标签: design-patterns database-design stored-procedures business-logic

我正在使用存储过程来访问我的数据库数据。我试图将业务逻辑放在代码中而不是存储过程中。但我有一个案例,我不知道如何解决:

我有一张像Items(item_id, itemd_name, item_price)这样的表,里面有700个项目。

现在我想显示客户端的所有项目及其名称。 自从我为web开发以来,我不想加载所有700项,而是使用分页 - 一次40项。

(当我写“load”时,我看到存储过程返回datatable并且我写的代码将每一行转换为一个item类 - 这就是为什么我不想加载700个项目,它会处理很多数据我真的不需要)

所以我编写了存储过程,知道可以获得40个项目。

现在,我需要汇总所有商品的价格并加上16%的税。

问题在于我无法使用我从该商店程序获得的40件商品,因为我需要总结所有700件商品的价格+税。

我找到的唯一解决方案是使用另一个将返回价格+税额的存储过程。

1 个答案:

答案 0 :(得分:2)

基本上,您使用两种不同的存储过程,用于两种不同的(虽然已连接)业务要求,这在我的书中是可以的。

第一个是:显示具有给定偏移量和页面大小的数据页面。 第二个是:根据一些规则显示数据摘要。

如果您使用只获取所有数据的简单存储过程,并且您可以在应用程序端处理分页和汇总,并且这将遵循您的“数据库中没有逻辑”规则,则两者都可以完成。当你有700行时,这不会是一个大问题,但是,如果这个数字达到数十万,那么加载和处理你真正不需要的大量物品会对性能造成很大的损失。

第二种方法是将分页逻辑放在一个proc中,将汇总逻辑放在另一个proc中。分页逻辑非常通用,因此不必将其视为“业务”,但为了有用,摘要生成必须包含实际业务逻辑。这将有效,表现明智,但显然会违反你的规则。

当然,没有一个正确的答案,但在大多数情况下,我不介意将业务逻辑放在数据库中,因为即使数据库的结构也受到系统业务规则的限制。如果我们绝对要“数据库中没有业务规则”,我们应该放弃默认值,检查约束等,因为它们也是对数据的业务限制,这些不是数据本身的属性。