确定是在数据库中还是在应用程序代码中创建功能可能是一项艰巨的任务。常常,您不会意识到自己做出了错误的选择,直到面对大麻烦为止。更糟糕的是,许多开发人员的决定都是基于他们最熟悉的SQL或应用程序编码!更好的方法是依靠技术的优势来帮助您做出决定。在今天的博客中,我们将细分在用户定义函数(UDF)和驻留在应用程序端的函数之间进行选择时的决策过程。
数据库功能!
在某些方面,数据库可以做得很好,而有些方面可能就比较困难。像存储过程一样,函数也是用SQL编写的。因此,它们将在SQL出色的任务上脱颖而出。这是此类任务的列表,以及为什么用SQL而不是应用程序代码最好地完成它们:
- 联接:在应用程序代码中,这可能需要复杂的数组操作
- 筛选数据(即WHERE子句):在代码中,这可能需要大量插入和删除列表中的项目
- 选择列:同样,在应用程序代码中,这可能需要大量列表或数组操作
- 聚合函数:在应用程序代码中,这可能需要数组来保存值和复杂的切换条件
- 外键完整性:在应用程序代码中,这可能需要在插入之前进行查询,并假设没有人会访问应用程序外部的数据
- 主键完整性:在应用程序代码中,这也可能需要在插入之前进行查询,并假设没有人会访问应用程序外部的数据
尝试不是依赖于SQL执行上述任何操作,这会不可避免地导致编写大量代码并降低效率,从而转化为调试和维护更多代码,以及较差的应用程序性能。
另一方面,DBMS不能胜任复杂的过程处理。那就是应用程序代码的领域。这是集成开发环境(IDE,Integrated Development Environment)的调试工具(例如VS Code或Eclipse)远远优于数据库开发环境中的任何工具的重要原因
案例研究
Sakila示例数据库是作为一种学习工具而开发的,并已在整个数据库社区中广泛共享。它是一个MySQL数据库,其中包含与虚构的视频租赁商店有关的许多表,视图,存储过程和函数。其中一个函数是stocker_in_stock。这是一个UDF,它接受一个stock_id输入参数并返回一个boolean值,指示该电影是否有库存。
这是Navicat Premium的函数设计器中的ventory_in_stock函数定义:
让我们快速运行它以了解其工作原理。
单击“运行”按钮将弹出一个对话框,以接受输入参数:
结果如下:
值为1表示该影片有存货。
现在,考虑如果我们用驻留在应用程序中的函数替换该函数会发生什么。它需要对数据库进行两次调用才能执行SQL语句。这将导致额外的网络流量,并要在应用程序内维护SQL。通常,这是一个坏的做法,因为它将数据库和应用程序代码混合在一起。
总结
在今天的博客中,我们了解到您应该将自定义函数代码放在最能受益于该技术优势的位置:在需要复杂过程处理时放在应用程序中,以及在需要SQL时放在数据库中。
有兴趣了解有关Navicat Premium的更多信息吗? 您可以免费试用14天,以进行评估!