我正在寻找处理这种情况的最佳方法。我想在数据库表中存储摊销计划。每行包含日期,当前余额,付款,主要,利息和新余额。对于典型的30年抵押贷款,这将是360行或数据库插入。在Delphi中,我应该从循环内使用多个数据库插入还是使用存储过程?
我应该在使用Delphi的循环内进行计算,并为每个结果执行插入操作,还是应该在存储过程中执行这些计算操作?
这将是一个单用户,本地机器,桌面应用程序。
我正在寻找处理这种情况的最佳方法。我想在数据库表中存储摊销计划。每行包含日期,当前余额,付款,主要,利息和新余额。对于典型的30年抵押贷款,这将是360行或数据库插入。在Delphi中,我应该从循环内使用多个数据库插入还是使用存储过程?
我应该在使用Delphi的循环内进行计算,并为每个结果执行插入操作,还是应该在存储过程中执行这些计算操作?
这将是一个单用户,本地机器,桌面应用程序。
我会做存储过程中的操作。这样处理数据就在它所属的数据库中。
此外,通过将所有与数据相关的操作保留在数据库中,您可以节省自己再次编码的麻烦,如果将来某个时候您选择切换语言。
准备好的查询和存储过程在性能上相当。作为一名应用程序开发人员,我对存储过程充满了激情,因为他们将逻辑从应用程序内部(我可以找到它)移动到其他地方,而不是在查看源代码时看不见的地方。让我们面对现实吧,如果有效的话,没有人会用另一种语言重新开发应用程序。
因此,如果你的事情是数据库和SQL,并且你对此感到满意,那么存储过程很好。但是,如果您主要是应用程序开发人员,则看不到使用存储过程而不是从代码执行查询的好处。
什么是“准备查询”,以及如何在Delphi应用程序中使用它? –
准备好的查询是一个参数化的查询,它已经在服务器上“分配”(准备好)资源以获得更好的性能。然后,您可以多次运行相同的查询,并且仅在服务器上“设置”(准备好)一次。查找您正在使用的查询组件(ADO,dbExpress等)上的Prepared属性。 – Misha
如果源数据已存在于数据库中,并且目标是相同数据库。然后,一个存储过程是唯一的方法,否则你的网络性能混合,并放慢操作。 –
如果您的数据库是本地数据库,并且您不希望有一天将其作为客户端/服务器,那么从性能角度来看可能没什么区别。很大程度上取决于您使用的数据库。 一些有“数组DML”,这将允许您执行一个数据库往返的所有360插入,基本上,而不是做360插入填充数组绑定变量并执行一个插入。无论如何,最糟糕的方式是使用n个没有绑定变量的插入。 如果数据库没有编译它(有些可能只是使用P代码),编译和优化的Delphi代码可能比解释存储过程代码稍快。从设计的角度来看,将DB中的数据逻辑通过存储过程发布为一种API(可能禁止其他修改数据的方式)可以确保对数据的更强的控制。
如果您碰巧使用AnyDAC,它支持所有支持数据库的ArrayDML。我认为这是一个漂亮的功能。这是商业软件,但是非常好的投资。 (我不是与之关联的任何方式,除非是非常满意的客户。)
我从客户锁定在甲骨文的世界来得那么DBMS的改变几乎是不可能的:) 。恕我直言,所有数据相关的操作(选择一个,但大多数具体的操作,包括修改一个或多个表)应该在他们所属的数据库中。还将业务规则存储在数据库中,并通过自定义API进行公开。无可否认,这会增加负责程序员的学习曲线,但我认为这是值得的。我承认这可能归结为应用程序的大小和正在从事它工作的人的偏好:) – phil
@Miho,是的,这是个人喜好,但是如果有人在我的项目中做了某个事情,会导致我死亡。对于应用程序开发人员来说,使用存储过程是一个毒蛇的巢!实质上,它将数据规则移出应用程序开发人员的范围,并将他们推到视线之外。我想知道数据是怎么回事,而不是神秘地出现在我的面前。 – Misha
@Misha,我同意你刚刚出现的数据。使用数据的人需要知道检索或处理的内容和方式。问题是应用程序开发人员和数据库开发人员之间的区别我不明白你的代码中出现了什么神秘的东西。如果我们在存储过程中放入某些东西,这并不意味着应用程序开发人员无法找到并修改/查看该过程?它只是增加了另一个抽象层次。一个好的(虽然DB偏见)视图:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2143974700346554115 – phil