我们应该在数据库中做多少工作? 好吧我真的很困惑,确切地说应该在数据库中完成多少“工作”,以及在应用程序级别需要完成多少工作?
我的意思是我不是在谈论明显的东西,比如我们应该在应用程序级别而不是数据库级别将字符串转换为SHA2哈希值。
而是更模糊的东西,包括但不限于“我们应该检索4列的数据并在应用程序级别执行大写/连接,或者我们应该在数据库级别执行这些操作并发送计算结果到应用程序级别?
如果你能列出更多其他例子,那就太棒了。
答案 0 :(得分:4)
这实际上取决于你需要什么 我喜欢在数据库中执行我的业务逻辑,其他人则反对这种逻辑。
您可以在SQL中使用触发器和存储过程/函数。
MySQL的链接:
http://dev.mysql.com/doc/refman/5.5/en/triggers.html
http://www.mysqltutorial.org/introduction-to-sql-stored-procedures.aspx
http://dev.mysql.com/doc/refman/5.5/en/stored-routines.html
我在触发器和存储过程中执行业务逻辑的原因
请注意,我不是在谈论将数据库结构向业务逻辑弯曲,而是在谈论将业务逻辑放在触发器和存储过程中。
有些人对此表示强烈反对,但这种方法对我来说效果很好,并且简化了我的应用程序的调试和维护。
答案 1 :(得分:0)
通常,从数据库中仅预期“Data
”是一种很好的做法。它应用于应用业务/域逻辑并理解检索到的数据。强烈建议在应用层中执行以下操作:
1)格式化日期 2)应用数学函数,如插值/外推等 3)动态排序(基于列)
但是,某些情况下某些情况下在数据库级别上几乎无法完成任务。
答案 2 :(得分:0)
在我看来,应用程序应该使用数据和数据库应该提供它们,并且应该明确区分关注点。因此,数据库根据请求的条件对记录进行排序,排序和过滤,但是应用程序可以将一些业务逻辑应用于该记录并将其“转换”为对用户有意义的内容。
例如,在我以前的公司,我们致力于大型应用程序的工作时间计算。这类应用程序中的一个显而易见的功能是跟踪员工的休假日 - 员工每年有多少天,他使用了多少,剩下多少等等。基本上我们可以写一些自动更新这些列的触发器和程序。因此,当员工休假时,他申请的天数是从他的“度假池”中取出并添加到“休假日”。非常简单的东西,但我们决定在应用程序级别和男孩明确表示,很快我们很高兴我们这样做了。申请必须符合劳动法,并且很快就发现不是所有员工的假期都是平等计算的,有时休假日可能不是休假日,但这是不重要的。如果我们把这个“简单”的操作放在数据库中,我们就必须对度假日相关逻辑的每一点改动都对我们的数据库进行版本化,这会导致我们直接进入客户支持领域,因为它可以只更新应用程序无需更新数据库(当然,数据库结构发生变化的明确“突破”时刻除外)。
答案 3 :(得分:0)
根据我的经验,我发现很多应用程序都是从一组直接的表开始,然后是一些存储过程以提供基本功能。这非常有效;它通常会产生高性能并且易于理解,它还可以减少对复杂中间层的需求。
然而,应用程序增长。看到具有数千个存储过程的大型数据驱动应用程序并不罕见。将触发器投入到混合中,你有一个应用程序,对于除了原始开发人员之外的任何人(如果他们仍在使用它),很难维护。
对于将大多数逻辑放在数据库中的应用程序,我会说一句话 - 当你有一些优秀的数据库开发人员和/或你有一个无法改变的遗留架构时,它们可以很好地工作。我之所以这么说是因为当你让他们控制架构时,ORM会从这部分应用程序开发中消除很多痛苦(如果没有,你经常需要做很多努力才能让它运行起来。)
如果我正在设计一个新的应用程序,那么我通常会选择一个由我的应用程序域决定的模式(其设计将在代码中)。我通常会让ORM处理对象和数据库之间的映射。在数据访问时,我会将存储过程视为规则的例外(在sprocs中,报告可能比试图使ORM有效地生成复杂输出更容易)。
最重要的是要记住,在设计方面没有“最佳实践”。开发人员可以在设计环境中权衡每个选项的优缺点。