scala mysql orm_ORM末日到了

本文探讨了面向对象编程与关系数据库之间的阻抗不匹配问题,指出ORM并非理想解决方案,并引向EventSourcing模式。Akka Persistence作为Event Sourcing的实现,提供了解决存储层阻抗不匹配的新思路,简化了数据持久化,让领域对象成为业务真相的源泉,降低了复杂性和潜在的bug。虽然可能存在性能和学习曲线的问题,但简单易用可能是其未来流行的关键因素。
摘要由CSDN通过智能技术生成

这是来自Pere Villega的一篇博文,主要从EventSourcing角度谈其对ORM的可替代性。

阻抗不匹配性

大部分信息系统都是持久化存储信息然后查询获取,这大部分是通过RDBMS完成的,不久NOSQL运动促使其成为一个关系数据库的替代者,总得来说,我们需要一个存储区域来保存数据。

但是,这不代表没有问题,流行的开发模型是基于面向对象编程语言配以关系数据库,这种组合有致命的问题:对象和关系阻抗不匹配性,换句话说,他们并不能在一起工作得很好,这其中有许多原因。

这不是一个新问题,人们也在艰难努力提供新的解决方案以消除痛苦,从一个开发者角度看,ORM可能缓解一下这种不匹配问题,即使只是稍微低,像Hibernate这样的工具负责与关系数据库层打交道,这样开发者不必花费时间在这上面,但是这并不完美,由于抽象泄漏定律使得问题变得棘手,任何使用过Hibernate的人都发现通过其框架实现的查询都不够完美,那就意味着开发者必须钻研得很深以便知晓如何告诉框架让它按自己的意图行事,这也通常意味着你进入了底层低级别,包括数据库层,阻抗不匹配问题又冒出来了。

这样,ORM作为一个完整的解决方案失败了,但是这是一个严重的问题,因为我们开发者已经为之付出了很多努力,在Scala的关系数据库列表中,我发现有6个不同的工具提供Scala和持久层之间的通讯联系,我们只是讲一种语言,还没有谈到Python或Java等类似名单,也不包括很多自己开发的内部ORM系统,他们是好的工具,是可以产品化规模使用的。

现在我们每年有多少人时投入其中呢?

即使我们开发者全部迁移到函数范式,Java 8的发布已经确认,即使NoSQL成为一个可行的候选方案,我们可以消灭了阻抗不匹配,但是换还要使用转换层来与关系数据库通讯,还需要转换我们的数据对象格式以便它们适合存储,你认为作为一个文档型的数据库MongoDB可以解决这个问题,如下:

query = new BasicDBObject("i",

new BasicDBObject("$gt", 20).

append("$lte", 30));

cursor = coll.find(query);

错误的方向?

如果我们花费这么多人时在这个问题上,它还会引起头痛,也许是我们的方向错了?

在应用中每个新组件都会增加系统的复杂性,这是一个好的复杂性,比如微服务,给你一个清晰的优势,即使增加了部件的数目,也有坏的复杂性,得学习像Hibernate这样一个完整的框架,这对于只是想将我的数据保存起来来说是过分了点。一个服务管理应用状态的存储是正确方向,但是当你在应用中有领域对象,其包含的数据和需要保存的数据有着完全不同的模型时,这就浪费时间了。

诚实讲,我们很多人这么做,这是很自然,以至于未觉察没有什么不对,直至正确的方式出现,Akka Persistence就是这样在正确方向出现的一个工具。

当然,我们不能欺骗自己,它也是一个必须学习的框架,它很可能一旦投入苛刻的生产环境,原先所有的承诺将会失败,但是请看看下面论述:

Akka持久框架提供了一个Event Sourcing模式的实现,可以忘记存储层阻抗不匹配,你的源码就是你的领域对象,你将变化存储到这些领域对象中,你能复制系统的任何时刻的状态,通过关注新的状态,不会有事务性问题出现(不修改原来的数据,永远只是新增数据,就没有多线程争夺,也就不需要全局事务JTA或数据库锁等),因为在数据层不再有对旧数据的修改发生,你能够任意截获随时间变化的状态序列,而关系数据库只能保存最后时刻的最后状态。

为什么要浪费时间在ORM或其他的选择吗?持久性一下子就变成了支撑系统,而不是你应用程序的主要组成部分之一。数据都驻留在你的领域中。你的领域对象是业务真相的源泉,而只有在确保它们的状态不会丢失的情况下,你才会将它们从内存中移除。这是很简单的。

为什么它会成功?

正如我所说的,有可能是我还没有考虑到技术问题。我可能无论是在用例或性能上存在盲目乐观的问题。也可能是因为它仅使用该存储系统来构建一个解决方案是不可行的。我可能是错误的。Akka持久框架有可能比目前的ORM在性能上轻微的差些,但是我不怀疑Typesafe有一批聪明的工程师会持续解决这些问题。

这坚信必定会成功的理由是:简单是王牌,看看这几年流行的技术:MySQL PHP Ruby MongoDb,它们都不是性能最优的,但是有短处,但是它们还是流行了,有很多开发应用,为什么?简单,如果这些技术有一个共同特点就是易于使用,任何开发者只要花几个小时学习基础就能使用它们。

下面是持久层了,请忘记学习SQL, 事务上下文 或ORM等复杂的技术,你的领域对象就是你的数据,这将成为大规模主流,增加软件的产品性,能够去除因为使用ORM导致的大量BUG和带来的扩展性问题,同时,你有一个简单且性能不错的框架。

我但愿我是错的...

翻译完:

相关参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值