在应用程序和数据库中执行计算的优缺点
1. 概述
通常,我们很难决定是否应该在数据库 (RDBMS) 或应用程序代码中执行计算以同时获得良好的性能和便利性。
在本文中,我们将探讨在数据库和应用程序代码中执行计算的优缺点。
我们将考虑一些可能影响此决定的因素,并讨论哪个层(数据库或应用程序)更适合处理它们。
2. 数据库中的计算
2.1. 数据选择和聚合
关系数据库针对数据的处理、选择和聚合进行了高度优化。我们可以使用 SQL 轻松地对数据进行分组、排序、过滤和聚合。
例如,我们可以使用LEFT和RIGHT JOIN从多个表中轻松选择和取消选择数据集。
类似地,像MIN、MAX、SUM和AVG这样的聚合函数比 Java 实现非常方便和快捷。**
此外,我们可以通过在聚合数据时利用索引来微调磁盘 IO 的性能。
2.2. 数据量
所有流行的 RDBMS 在处理来自表的大量数据以执行计算方面提供了无与伦比的性能。
但是,与数据库相比,我们需要大量资源(例如内存和 CPU 处理)来处理应用程序中类似数量的数据。
此外,为了节省带宽,建议在数据库中执行以数据为中心的计算,从而避免通过网络传输大量数据。
3. 应用中的计算
3.1. 复杂
与数据库不同,Java 等高级语言在处理复杂计算方面具备出色的能力。
例如,我们可以利用Java 中的异步编程 、并行执行 和多线程 来解决复杂问题。
同样,数据库为日志记录和调试提供了最低限度的支持。然而,今天的高级语言对这些关键特性有很好的支持,这些特性在实现复杂的计算时通常很方便。
例如,我们可以使用 SLF4J 在 Java 应用程序中轻松添加日志记录,并使用流行的 IDE(如Eclipse 和IntelliJ IDEA)进行调试 。因此,与数据库相比,在应用程序中执行计算对于开发人员来说是一个方便的选择。
同样,另一个论点是我们可以轻松地在应用程序代码中对我们的计算进行单元测试,这在数据库中执行相当复杂。
单元测试证明在检查实现的变化方面非常方便。所以,在Java应用中进行计算时,我们可以使用JUnit来添加单元测试 。
3.2. 高级数据分析和转换
该数据库为高级数据分析和转换提供有限的支持。但是,使用应用程序代码执行复杂的计算很简单。 例如,Deeplearning4J 、Weka 和TensorFlow 等各种库可用于高级统计和机器学习支持。
另一个常见的用例是我们可以使用 Hibernate 等 ORM 技术轻松地将数据对象化,使用Java Streams 等 API对其进行处理,并通过XML 或JSON 解析库生成各种格式的结果。
3.3. 可扩展性
实现数据库可扩展性可能是一项艰巨的任务,因为 RDBMS 只能扩展。但是,应用程序代码提供了一种更具可扩展性的解决方案。
我们可以轻松地扩展应用服务器并使用负载均衡器处理大量请求。
4. 数据库与应用程序
现在我们已经看到了在每一层基于某些因素执行计算的优势,让我们总结一下它们的区别:
- 数据库是数据选择、聚合和处理大量数据的首选
- 但是,在考虑复杂性、高级数据转换、第三方集成和可扩展性等因素时,在应用程序代码中执行计算看起来更合适
- 此外,高级语言提供额外的好处,如日志记录、调试、错误处理和单元测试功能
混合和利用两层的优点来解决复杂问题总是一个好主意。
换句话说,使用数据库来选择和聚合数据,然后将有用的精益数据传输到应用程序,并使用高效的高级语言对其执行复杂的操作。