在SQL中放置逻辑的优点和缺点?

Nat*_*ong 7 sql

在一项新工作中,我刚刚接触了将逻辑放入SQL语句的概念.

在MySQL中,一个愚蠢的例子是这样的:

SELECT
    P.LastName, IF(P.LastName='Baldwin','Michael','Bruce') AS FirstName
FROM
    University.PhilosophyProfessors P
// This is like a ternary operator; if the condition is true, it returns 
// the first value; else the second value. So if a professor's last name 
// is 'Baldwin', we will get their first name as "Michael"; otherwise, "Bruce"**
Run Code Online (Sandbox Code Playgroud)

对于一个更现实的例子,也许您正在决定销售人员是否有资格获得奖金.您可以获取各种销售数字并在SQL查询中进行一些计算,并返回true/false作为名为"qualifies"的列值.

以前,我会从查询中获取所有销售数据,然后在我的应用程序代码中完成计算.

对我来说,这似乎更好,因为如果有必要,我可以使用调试器逐步完成应用程序逻辑,但无论数据库做什么,对我来说都是一个黑盒子.但我是初级开发人员,所以我不知道什么是正常的.

让数据库服务器执行一些计算/逻辑有什么优缺点?

**基于Monty Python草图的代码示例.

Kon*_*rus 7

这样SQL就成为域模型的一部分.它是实现领域知识的又一个(并不一定是显而易见的)地方.这种泄漏会导致业务逻辑/应用程序代码和数据库之间更紧密的耦合,这通常是个坏主意.

一个例外是观点,报告查询等.但这些通常是如此孤立,以至于它们扮演的角色显而易见.


Mar*_*tos 7

将逻辑推送到数据库的最有说服力的理由之一是最小化流量.在给出的示例中,几乎没有收获,因为无论逻辑是在查询中还是在应用程序中,您都在获取相同数量的数据.

如果您只想获取名字第一的用户Michael,那么在服务器上实现逻辑更有意义.实际上,在这个简单的例子中,它没有太大区别,因为你可以指定姓氏的用户Baldwin.但是考虑一个更有趣的问题,即根据他们的名字和名字的常见程度给每个用户一个"受欢迎程度"分数,并且你想要获取10个"最受欢迎"的用户.在应用程序中计算"流行度"意味着您必须在排名,排序和在本地选择之前获取每个用户.在服务器上计算它意味着你可以通过网络只获取10行.