我已经开发了大约6年的网络/桌面应用程序。在我的职业生涯中,我遇到了使用存储过程在数据库中大量编写的应用程序,而许多应用程序只为每个实体只有几个基本存储过程(读取,插入,编辑和删除实体记录) 。
我见过人们争辩说,如果你已经为企业数据库付费,那就广泛使用它的功能。虽然很多“面向对象的架构师”告诉我,在数据库中放置任何必要的东西是绝对的犯罪,你应该能够使用这些类的方法来驱动应用程序吗?
您认为余额在哪里?
谢谢, Krunal
答案 0 :(得分:6)
我认为这是业务逻辑与数据逻辑的关系。如果存在确保数据一致性的逻辑,请将其放入存储过程中。用于数据检索/更新的便利功能。
其他所有内容都应该进入代码。
我的一位朋友正在为生物信息学中的数据分析算法开发大量存储过程。我认为他的方法非常有趣,但从长远来看并不是正确的方法。我的主要反对意见是可维护性和缺乏适应性。
答案 1 :(得分:5)
我在面向对象的建筑师阵营。将代码放入数据库并不一定是犯罪行为,只要您了解随之而来的警告即可。以下是一些:
答案 2 :(得分:4)
与参考完整性或一致性相关的任何内容都应该作为最低限度在数据库中。如果它在您的应用程序中并且有人想要针对数据库编写应用程序,则他们将不得不在其代码中复制您的代码以确保数据保持一致。
PLSQL for Oracle是一种非常好的访问数据库的语言,它也可以提高性能。您的应用程序也可以更“整洁”,因为它可以将数据库存储过程视为“黑盒子”。
也可以调整和修改sprocs本身,而无需靠近已编译的应用程序,如果应用程序的供应商已经停业或不可用,这也很有用。
我不是在提倡'一切'应该在数据库中,远非如此。单独和逻辑地对待每个案例,您将看到哪个更有意义,将其放入应用程序或将其放入数据库。
答案 3 :(得分:3)
我来自几乎相同的背景,听过同样的论点。我确实理解将逻辑放入数据库是非常有效的。但是,它取决于应用程序的类型以及它处理数据的方式,您应该选择这种方法。
根据我的经验,典型的数据输入应用程序(如某些客户(或xyz)管理)将大大受益于使用ORM层,因为数据上没有太多不同的视图,您可以将样板CRUD代码减少到最小
另一方面,假设您的应用程序具有大量并发和计算,这些应用程序跨越很多表并且具有带锁定等的细粒度列级安全性概念,您可能会更好直接在数据库中做这样的事情。
如前所述,它还取决于您预期的数据视图的多样性。如果有许多不同的列和表组合需要呈现给用户,那么您最好只需回送不同的结果集,而不是将对象逐个映射到另一个表示。
毕竟,数据库擅长处理集合,而OO代码擅长处理单个实体。
答案 4 :(得分:2)
阅读这些答案,我对数据库编程缺乏了解感到困惑。我是Oracle Pl / sql开发人员,我们为进入数据库的每一段代码提供控制权。许多IDE为大多数主要源代码控制产品提供了插件。从ClearCase到SourceSafe。我们使用的Oracle工具允许我们调试代码,因此调试不是问题。问题更多的是逻辑和可访问性。
作为支持大约5000个用户的经理,我必须寻找逻辑的地方越少越好。如果我想确保逻辑应用于使用数据的所有应用程序,甚至是业务逻辑,我将它放在数据库中。如果逻辑因应用程序而异,则可以对其负责。
答案 5 :(得分:1)
@DannySmurf:
它不可调试
根据您的服务器,是的,它们是可调试的。 This provides an example for SQL Server 2000。我猜这些新人也有这个。但是,免费的MySQL服务器没有这个(据我所知)。
不受源代码管理
是的,确实如此。的种类。数据库备份应包括存储过程。这些备份文件可能位于您的版本控制存储库中,也可能不存在。但无论哪种方式,您都可以备份存储过程。
答案 6 :(得分:1)
我个人的偏好是尝试尽可能多地保留数据库中的逻辑和配置。这些天我非常依赖Spring和Hibernate,这使得它变得更加容易。我倾向于在Spring应用程序上下文XML文件中使用Hibernate命名查询而不是存储过程和静态配置信息。必须使用脚本加载需要进入数据库的任何内容,并将这些脚本保留在版本控制中。
答案 7 :(得分:0)
@Thomas Owens :(重新控制源代码)是的,但是这不是源代码控制,我可以在.cs文件(或.cpp文件或其他)中查看,并选择我想要的任何修订版本。要使用数据库代码执行此操作,需要花费大量精力才能从数据库中检索过程并将其传输到源树中的某个位置,或者每次进行微小更改时都要进行数据库备份。在任何一种情况下(无论付出多少努力),都不直观;而对于许多商店来说,这也不是一个好的解决方案。对于那些可能没有那么好学的开发人员而言,其他人也有可能忘记检索和检查修订版。技术上可以将任何东西放在源代码控制中;这里的脱节是我要问的问题。
(re debuggable)很公平,虽然这并没有提供与应用程序其余部分(大多数代码可以存活)的大量集成。这可能是也可能不重要。
答案 8 :(得分:0)
好吧,如果您关心数据的一致性,那么有理由在数据库中实现代码。正如其他人所说,在数据库中放置代码(和/或RI /约束)可以强制执行业务逻辑,靠近数据本身。并且,它提供了一个通用的封装接口,因此您的新开发人员不会意外地创建孤立记录或不一致的数据。
答案 9 :(得分:-3)
我看到编写编写存储过程的唯一原因是:
对于大多数应用程序,您应该尝试将代码保存在可以调试它的应用程序中,将其保留在版本控制之下并使用您的语言提供给您的所有工具进行修复。