SQL中是否应该写逻辑

294 阅读2分钟

SQL中是否应该写逻辑

问题

如果我们有不同业务需要更新表的不同字段,我们是应该为每个业务单独写SQL,还是写个更新全部字段的SQL,还是写个动态SQL根据传入的对象非空拼接?

问题举例-用户信息更改

用户信息

image-20220709081635418

我们需要实现三个用例:

image-20220709081658637

方案一:单独写Sql

如果不使用DDD,对业务还是很友好的,DAO层保证了不可以随便修改数据;很多人认为这种写法让DAO介入了业务,可以用依赖倒置来解释,DAO的实现类知识实现了业务层定义的三个接口方法,DAO并不知道真实的业务。

image-20220709081725126

方案二:整体更新

更新传入的对象的所有字段,符合DDD的Repository的做法,完全依赖业务逻辑控制。

image-20220709081741318

方案三:动态Sql

根据传入的值非空来判断执行的sql,个人非常不推荐这种写法,对业务体验很差。两头都不靠,不是DDD,也不是业务的SQL。

update User set
<isNotEmpty property="email">
  email=#email#
</isNotEmpty>
<isNotEmpty property="pwd">
  pwd=#pwd#
</isNotEmpty>
<isNotEmpty property="pin">
  pin=#pin#
</isNotEmpty>
此处省略其他字段,这种写法为了共用这个Sql,一般会写上User的所有字段
where id=#id#

image-20220709081757651

最后给个整体对比图,可以思考写不同的优缺点,第一种我认为是很多企业在用的,没有太大问题;第二种是DDD的,对业务支撑最灵活,但目前数据库和DDD对象(聚合根)不太匹配,不太好映射,使用较少(我在一些项目上,直接使用聚合根Json化存储,不存在映射问题,业务可以使用DDD建模,实际证明对业务的支撑非常好);第三种不推荐。