我已经开发了大约6年的网络/桌面应用程序。 在我的职业生涯中,我遇到了使用存储过程在数据库中大量编写的应用程序,而许多应用程序只为每个实体只有几个基本存储过程(读取,插入,编辑和删除实体记录) 。

我见过人们争辩说,如果你已经为企业数据库付费,那就广泛使用它的功能。 虽然很多“面向对象的架构师”告诉我,在数据库中放置任何必要的东西是绝对的犯罪,你应该能够使用这些类的方法来驱动应用程序吗?

您认为哪里是平衡?

谢谢,Krunal

===============>>#1 票数:6

我认为这是业务逻辑与数据逻辑的关系。 如果存在确保数据一致性的逻辑,请将其放入存储过程中。 用于数据检索/更新的便利功能相同。

其他一切都应该进入代码。

我的一位朋友正在为生物信息学中的数据分析算法开发大量存储过程。 我认为他的方法非常有趣,但从长远来看并不是正确的方法。 我的主要反对意见是可维护性和缺乏适应性。

===============>>#2 票数:5

我是面向对象的建筑师阵营。 将代码放入数据库并不一定是犯罪行为,只要您了解随之而来的警告即可。 这里有一些:

  1. 它不可调试
  2. 它不受源代码控制
  3. 您的两组代码的权限将有所不同
  4. 如果您从两个位置访问数据库中的信息,将更难以跟踪数据中的错误来源

===============>>#3 票数:4

任何与参照完整性或一致性相关的内容都应该作为最低限度在数据库中。 如果它在您的应用程序中并且有人想要针对数据库编写应用程序,则他们将不得不在其代码中复制您的代码以确保数据保持一致。

PLSQL for Oracle是一种非常好的访问数据库的语言,它也可以提高性能。 您的应用程序也可以更“整洁”,因为它可以将数据库存储过程视为“黑盒子”。

sprocs本身也可以进行调整和修改,而无需靠近已编译的应用程序,如果应用程序的供应商已经停业或不可用,这也很有用。

我不是在提倡'一切'应该在数据库中,远非如此。 单独和逻辑地对待每个案例,您将看到哪个更有意义,将其放入应用程序或将其放入数据库。

===============>>#4 票数:3

我来自几乎相同的背景,听过同样的论点。 我确实理解将逻辑放入数据库是非常有效的。 但是,它取决于应用程序的类型以及它处理数据的方式,您应该选择哪种方法。

根据我的经验,像一些客户(或xyz)管理这样的典型数据输入应用程序将大大受益于使用ORM层,因为数据上没有太多不同的视图,您可以将样板CRUD代码减少到最小。

另一方面,假设你有一个具有大量并发和计算的应用程序,这些应用程序跨越很多表,并且具有带锁定等的细粒度列级安全性概念,你可能最好做一些像直接在数据库中。

如前所述,它还取决于您预期的数据视图的多样性。 如果有许多不同的列和表组合需要呈现给用户,那么您最好只需要回送不同的结果集,而不是将对象逐个映射到另一个表示。

毕竟,数据库擅长处理集合,而OO代码擅长处理单个实体。

===============>>#5 票数:2

阅读这些答案,我对数据库编程缺乏了解感到困惑。 我是Oracle Pl / sql开发人员,我们为进入数据库的每一段代码提供控制权。 许多IDE为大多数主要源代码控制产品提供了插件。 从ClearCase到SourceSafe。 我们使用的Oracle工具允许我们调试代码,因此调试不是问题。 问题更多的是逻辑和可访问性。

作为支持大约5000个用户的经理,我需要寻找逻辑的地方越少越好。 如果我想确保逻辑应用于使用数据的所有应用程序,甚至是业务逻辑,我将它放在数据库中。 如果逻辑因应用程序而异,则可以对其负责。

===============>>#6 票数:1

@DannySmurf:

它不可调试

根据您的服务器,是的,它们是可调试的。 这为SQL Server 2000提供了一个示例 我猜这些新人也有这个。 但是,免费的MySQL服务器没有这个(据我所知)。

它不受源代码控制

是的。 的种类。 数据库备份应包括存储过程。 这些备份文件可能位于您的版本控制存储库中,也可能不存在。 但无论哪种方式,您都可以备份存储过程。

===============>>#7 票数:1

我个人的偏好是尝试尽可能多地保留数据库中的逻辑和配置。 这些天我非常依赖Spring和Hibernate,这使得它变得更加容易。 我倾向于在S​​pring应用程序上下文XML文件中使用Hibernate命名查询而不是存储过程和静态配置信息。 必须使用脚本加载需要进入数据库的任何内容,并将这些脚本保留在版本控制中。

===============>>#8 票数:0

@Thomas Owens :(重新控制源代码)是的,但这不是源代码控制,我可以在.cs文件(或.cpp文件或其他)中检查,并选择我想要的任何修订版本。 要使用数据库代码执行此操作,需要花费大量精力才能从数据库中检索过程并将其传输到源树中的某个位置,或者每次进行微小更改时都要进行数据库备份。 在任何一种情况下(无论付出多少努力),都不直观; 而对于许多商店来说,这也不是一个好的解决方案。 对于那些可能没有那么好学的开发人员而言,其他人也有可能忘记检索和检查修订版。 技术上可以将任何东西放在源代码控制中; 这里的脱节是我要问的问题。

(可重新调试)很公平,虽然这并没有提供与应用程序其余部分(大多数代码可以存活)的大量集成。 这可能重要也可能不重要。

===============>>#9 票数:0

好吧,如果您关心数据的一致性,则有理由在数据库中实现代码。 正如其他人所说,在数据库中放置代码(和/或RI /约束)可以强制执行业务逻辑,靠近数据本身。 并且,它提供了一个通用的封装接口,因此您的新开发人员不会意外地创建孤立记录或不一致的数据。

===============>>#10 票数:-3

嗯,这个很难。 作为一名程序员,你会想尽可能地避免使用TSQL和这样的“数据库语言”,因为它们很可怕,难以调试,不可扩展,你无法用它们做任何你无法做到的事情。在您的应用程序上使用代码

看到编写存储过程的唯一原因是:

  1. 您的数据库不是很好(想想SQL Server如何不实现LIMIT,您必须使用过程来解决这个问题。
  2. 您希望能够通过在一个位置更改代码来更改行为,而无需重新部署客户端应用程序。
  3. 客户端计算机具有很大的计算能力限制(想想小型嵌入式设备)。

但是对于大多数应用程序,您应该尝试将代码保存在可以调试它的应用程序中,将其保留在版本控制之下并使用您的语言提供给您的所有工具进行修复。

  ask by Krantz translate from so

未解决问题?本站智能推荐: