探寻关系数据库和ORM的最佳替代者(转载)

源地址:http://database.51cto.com/art/200905/123802.htm

 

【51CTO独家特稿】一个数据库的持久性整体规划通常都是不成套的。各种ORM(对象关系映射)工具都能更容易地进行对象和数据结构之间的转换,但没有一个是完美的。这就是通常所说的“ORM Impedance Mismatch(阻抗不匹配)”。虽然抽象数据库是一个崇高和理想的目标,但没有考虑关系数据库这一事实总是会暴露出来。Joel Spolsky称之为“The Law of Leaky Abstractions(泄露的抽象规律)”。51CTO编者注:Joel Spolsky是一个美国的软件工程师,他的网络日志“Joel谈软件”(Joel on Software)非常有名,读者人数可以排进全世界前100名。

ORM

最简单的分离形式是由“映射层次对象到数据库表”所描述。这件事绝对是可以做到的,对于其实现毫无质疑。花费在设计理想映射的大量努力,也许可以更好地用于解决真正的问题,而不是在仔细检查问题之前就考虑解决方案。

更多的根据来自于最近发表在DZone的一篇文章。作者抱怨开发人员胡乱编写代码,使得数据库的使用效率超级低。虽然如此,但这样的问题只有在你了解低层实现的情况下才能暴漏出来。从纯粹的面向对象的角度来看,代码还算可以。

数据库基础

笔者认为关于数据库解决方案的最根本问题来自于这样一个事实,即人们总是默认地拘泥于某一个应用。“我们需要保持持久性。”“那好吧,让我们使用一个数据库吧[和ORM]”。

虽然RDBMS(关系型数据库管理系统)是一个很好的、成熟的解决方案,但它并不总是最理想的。在认真分析领域问题之前就先选择一个解决方案始终是错误的。

核心问题是,我们希望能够保存和恢复应用程序中某些数据结构的状态。需要一些关键点用来在各种机器之间共享这些状态(用于可扩展性)。

尝试删除RDBMS

所有尝试都不外乎建立一个所谓的面向对象数据库,这证明,除了RDBMS我们还有别的选择。我们有了一些很酷的工具,如Apache的CouchDB,它改变了我们考虑数据库的方式。特别是如JCR(针对Java的内容知识库),它提供了存储数据的另一种方法,看起来更像我们真正要涉及的对象。

所有这些方法都有一个很大的缺点,在某些时候,你会映射一些其他的数据格式到你的对象,是否还要映射属性/ xml文件、元数据(注释),或只是代码。各种系统都能简单完成这个任务,但总有某个地方让人觉得有问题。

很多都只是RDBMS的再包装,本质并不脱离RDBMS。暴露出来的问题是一些查询极其缓慢,而其他的速度却极快。直到你能理解数据库是怎样被使用的,你才能明白这是为什么。这会导致代码进行修改,以便能以尽可能最快的方式运行,抽象就被打破了。

几年前,笔者曾经试图用Lucene搜索索引取代只读数据库。它实际上运行得相当出色。使用Lucene搜索索引来查询数据比调用RDBMS要快很多。在特殊情况下,要快2个数量级之多,但还存在其他问题……这个概念从未真正占据主流。无论有多么不方便,都很难打破人们心理上对于数据库解决方案的传统认识。51CTO编者注:有关Lucene搜索的使用方法,可参考用Lucene做一个简单的Java搜索工具一文。


理想的解决方案

如果你的应用程序只是要维护它的状态,那将会存在理想的解决方案吗?

◆重启之间

◆机群的机器之间

在这样一个世界里,你根本不认为会存在一个持久性机制。你只是编写你的应用代码;设置对象域;机群中某个机器的线程死亡时的恢复处理 。

只是一个梦想?

我们即将迎来2010年。你要知道,现在我们已经有了在一组计算机之间分享系统状态的方法。有办法在一个文件系统中保留状态备份,允许在系统重启或崩溃时进行恢复。

你应该能够编写你的应用程序,假设它只能够运行在没有崩溃的单个机器上。

具有串行化的解决方案?

使用串行化来简单地保持应用程序的状态,这种办法怎么样?或者基于图像的持久性,如Smalltalk ?

在使用C / C++ 的日子里,我们可以获得对象在内存中的地址,然后把字节地址写到磁盘。这是一种简单的保存和恢复系统状态的方法。Java提供了一个完整的串行化API (地址不能用于安全方面的考虑)。

可以创建一个线程来不断保持串行化数据文件随着应用程序中对象的更新。然而,这种解决方案在一个机群中可能施行得不太好。透明度将会消失。接口被污染(需要实现串行化的事物)。

虽然简单,串行化可能不会是最好的解决办法,但是,这将会是一个有趣的实验。

共享内存

实现共享内存最明显的方法是建立一个后台进程,保持一组机器内存同步,同时保存一个文件。这将保持各个机器与其他机器同步操作,如果其中一个机器崩溃(如果它不能从邻居机器读取状态),利用该文件可以进行恢复。

看起来似乎一个虚拟机可能会为实现一个解决方案提供最大的成功机会,通过虚拟机,它能让一些不可思议的事情更容易地发生在内存访问背后,而不是发生在直接访问内存空间时。

解决方案

因此,现在都存在哪些解决方案?

Oracle Coherence

Oracle Coherence

Oracle用他们的Coherence产品做出了一个很好的尝试。

这个解决方案的问题在于它的实现。在网络间传送整个对象可以迅速让网络达到饱和(如各种HTTP会话共享模式所表现出来的问题)。Coherence还需要接口,需要对象实现串行化(但这个问题比较小) 。

对于这些问题,Oracle解决方案在某些情况下可能是有用的,并会随着技术的成熟而逐渐改善。风险是,该解决方案被打断到Oracle的数据库集群业务中。改善该项目的驱动力可能不会很高。

Terracotta

Terracotta

Terracotta似乎会提供以下列表内的所有需求:

◆网络间同步

◆用磁盘保留状态同步

◆透明的

◆快速的

Terracotta解决了笔者想要解决的一切问题,而且用一个优化的透明解决方案进行管理。不需要强制对象执行串行化、不需要进行其他任何类型的实现改变,它可以透明地工作于虚拟机之下。它通过发送不同的对象而不是整个对象,来设法优化网络使用率。它甚至保留状态与文件系统的同步。总之,是目前最透明的持久性系统。

唯一需要强调的是,它只支持Java版本,不支持.net。因此,想要使用它,你只能选择Java, Haskell, Scala, Groovy, jRuby, Jython, JavaScript或其他任何可以运行于JVM(Java虚拟机)的语言。

真实的魔术

Terracotta不会进行机器之间不必要的复制。它只做足以提供故障切换保护的工作,其余的事情会按需而做。它甚至会把不使用的数据从一台机器中剔除。

另外,对于每台新添加到机群中的机器,为每台机器增加有效内存。

当笔者看到类似这样的事,笔者就想知道,除此之外,笔者还会需要数据库为笔者做什么事。

笔者唯一可以想到的是,为数据挖掘和商业智能软件包提供可用数据(或数据仓库)。多数这些工具已经围绕数据库进行设计。

因此,RDBMS有效地成为了一个日志机器。

 

放弃RDBMS

因此,通过使用由Terracotta所提供的公共收藏(集合/列表/映射),完全可以放弃使用RDBMS。其结果是整洁的(具有更好的可维护性)代码,更有效的内存使用,和更快的执行时间。

有什么理由不喜欢Terracotta呢?

是否将概念取消?

是否取消使用共享内存的概念,作为摆脱数据库的一种方式。

笔者希望如此。这是一个人人都想拥抱简单的时代。Ruby on Rails, Grails, Spring, Wicket和其他框架的增加已经表明,大多数开发人员已经受够了过分复杂的解决方案。

他们可能会愿意完全摆脱一个复杂的解决方案。

也许,我只是完全错误的

或许RDBMS仍是一个很难移除的角色,可能是由于这个角色担当着重要的任务,有着重要的目的,例如是针对多个程序的集成点(就像Martin Fowler在他的Database Thaw Post中所说的) 。

Fowler实际上是建议建立一个HTTP包围数据库。这就把它从一个集成点转换成了一个应用程序。笔者已经参与了这种类型的应用,它具有一些非常强大的功能。

本文所说的可能不会适用的另一个领域是数据仓库。但是,把它封装在REST层,将是一个极好的应用。

作为一个针对各种应用的共有方式,不考虑它的实现,为了共享数据,使用RDBMS似乎很难被击败。据笔者所知,Terracotta解决方案可以工作于基于JVM的应用程序之间。但是,对于其他语言(C / C + + / Smalltalk )可能是有点困难。

原文:Best alternative to RDBMS and ORMs : Terracotta by Taranfx


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Entity Developer是一个强大的ORM设计器,支持 ADO.NET Entity Framework, NHibernate, LinqConnect 和 LINQ to SQL。你可以使用模型首先和数据首先的方法设计ORM模型并生成C#或者Visual Basic .NET代码。它引入了新的方法设计ORM模型,提高开发效率,简化数据库应用的开发。 可视化ORM模型设计器并支持代码生成 Entity Developer允许你可视化创建和编辑NHibernate,Entity Framework,LinqConnect 和 LINQ to SQL模型,无需一行XML代码。它支持创建各种一映射,如表分割,映射实体到多个表,复杂类型,继承分层,从Sel ect语句创建实体,从SQL代码创建方法等。由于使用了类似T4的模板,所以代码生成非常灵活,另外你还能创建自己的模板用于其他的编程语言。 多ORM支持 Entity Developer 支持 NHibernate, Entity Framework,LinqConnect 和 LINQ to SQL模型。 强大的代码生成 Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证框架等。另外模板提供自动生成MVC Controller和视图的功能。Data Transfer Object 提供转换器类和Data Annotations metadata类。 适用于各种.NET ORM的可视设计器 Entity Developer可以帮助您在一个统一的界面中为各种.NET ORM设计模型。您可以在一个工具中获得对所有ORM的支持,或者您可以购买单独的版本,与其中一个受支持的ORM一起使用。 支持EntityFramework和EF Core 对于Entity Framework v1-v6以及最新的EF Core2.2,我们的设计器提供了比EDM设计器更多的设计和代码生成功能。 Entity框架核心 设计实体框架核心模型可视化。通过大量设置获得模型优先和数据库优先支持。 NHibernate 直观地编辑NHibernate模型,为NHibernate 3或4生成XML,流畅或Loquacious映射和配置。 LINQ to SQL 直观地设计LINQ to SQL模型。 获得更好的模型优先和数据库优先支持,并轻松将模型更改应用于数据库。 LinqConnect 积极支持Devart的LINQ to SQL兼容ORM以及更多功能,Entity Developer作为其ORM设计器。 Telerik数据访问 可视化设计最新Telerik数据访问版本的模型,并通过Fluent Mapping API生成仅代码映射。 功能丰富的设计器,具有强大的代码生成功能 无缝Visual Studio集成 支持Model-First和Database-First 可视化创建几乎所有类型的映射 将模型更改应用于数据库,反之亦然 强大的模型重构 优化大型模型的工作 设计时LINQ / ESQL / HQL查询执行 查看和编辑源表中的数据 背景模型验证 基于T4模板的代码生成 大量预定义模板 生成C#或VB代码 每个类的文件,部分类生成 自定义属性支持 自定义模板支持 带语法高亮的模板编辑器 高质量的生成代码 高度可定制的一代
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值