Christof Wittig 和 Ted Neward 谈论面向对象语言到数据库的映射
我强烈建议我们的读者看看 Ted Neward 的“计算机科学的越南”,这篇文章将面向对象语言与关系数据库甚至对象关系数据库融合时产生的困境比作越南战争的泥潭。可以在 www.odbms.org/vietnam.html 找到 Ted 文章的链接。
这篇文章讨论了一个称为对象关系阻抗失配的问题。以下是我对这个问题的总结
我们拥有两种伟大的技术:面向对象语言和关系数据库。然而,当您尝试将两者融合时,问题就出现了,因为两者都不是为了与对方无缝协作而设计的。查询示例风格的编程可能解决这个问题,但这仅适用于简单的数据库访问。将类映射到表可能有效,但数据库的规范化使这种方法变得困难。例如,“客户”表不太可能包含客户居住的城市和州。数据库管理员 (DBA) 可能会提取该数据并按邮政编码将其存储在另一个表中。一种选择是简单地将查询字符串传递给数据库并手动整理字段。如果数据类型处理不当,这很可能导致性能问题和崩溃。更令人困惑的是,即使您做的一切都正确,DBA 始终有可能以某种方式更改数据库,从而破坏您的代码。
像 PHP 这样的语言包含一些技巧来帮助平滑语言到数据库的映射,但即使这些技巧也可能被数据库模式的某些更改所破坏。问题在于,这些选项仅仅是技巧,而不是真正的数据库到语言的映射技术。
LJ:这个总结是否相当到位,或者您想补充一些内容?
Ted:这里有很多问题需要考虑,其中之一是开发人员和 DBA 之间关于“谁拥有数据”以及更重要的,与该数据对应的模式的根本张力。拥有模式的开发人员将创建一些他们用起来舒服,但 DBA 操作起来笨拙的东西,而拥有模式的 DBA 将创建一些易于他们维护和报告的东西,但这反过来又给开发人员带来了笨拙。认为一种技术——任何技术——将完全消除那些从根本上植根于政治的问题是有些愚蠢的。
Christof:对象/关系、双模式方法将数据置于应用程序之上并交到 DBA 手中,这在传统的集中式企业 IT 环境中具有组织优势。然而,还有一整类应用程序,其数据存储完全嵌入且最终用户不可见——例如,在设备软件、手机或 PC 上的打包软件、实时控制系统和 SOA 应用程序中。这些零管理数据库场景没有从拥有两个模式中获益,但却承担了调和这些固有的不兼容模型的全部成本。分布式和移动软件架构在网络世界中激增,推动了对零管理数据库引擎的需求,因此我们将来会听到更多关于它们的消息。
LJ:我意识到并非所有自称“关系型”的数据库实际上都符合 Codd 和 Date 对关系数据库的学术观点。但是,撇开这一点不谈,这个问题是否仅限于关系数据库映射到 OO 语言?为什么对象关系数据库 (ORDBMS) 不能解决这个问题?或者它们能解决吗?
Ted:在很多方面,阻抗失配不仅仅限于对象和关系;尝试将对象塞入分层数据格式(如 XML)也会遇到一些相同的问题。因此,认为这“仅仅”是一个对象关系问题是具有误导性的。Date 对此的立场很有趣;他坚持认为 ORDBMS 实际上并不存在,对象的字段实际上只不过是表中的列(或关系中的属性,使用他更正式的术语)。这也意味着继承只不过是表之间的一种简单关联,以某种方式默默地连接在一起,但他似乎没有明确说明(至少在他的第八版 数据库系统导论 中没有)。虽然我不打算与他辩论关系理论,但我怀疑他对对象世界的看法有些偏差,因此并非完全准确。
LJ:有些人质疑你为什么将这个技术问题与越南战争进行比较,实际上认为这是一个完全不恰当的比较。您对此有何看法?
Ted:我真的有两种反应。首先,对于所有那些因有人将越南比作与战争或政治冲突无关的事情而感到冒犯的人,我很抱歉他们感到冒犯,但美国参与越南战争已经结束 30 多年了,现在是我们作为一个国家长大成人,停止舔舐旧伤的时候了。是的,坏事发生了,其中一些发生在我们身上,其中一些是因为我们。现在是我们开始批判性地看待越南的时候了,而不是处于膝跳反应的情绪状态。
其次,越南在很多方面都是对许多对象/关系映射工具发生的事情的完美类比,不仅仅是因为越南现在是“泥潭”的代名词,而是因为,根据罗伯特·麦克纳马拉最近出版的回忆录,美国领导人知道他们正在陷入潜在的泥潭,并认为他们可以以某种方式控制它。对许多人来说,越南是不明确目标的定义,但麦克纳马拉的回忆录清楚地表明,美国实际上试图“赢得”战争,这意味着赢得越南人民的“人心”。只是不清楚他们如何才能用他们可用的工具来实现这一目标。O/R-M 的情况类似:我们清楚地知道我们想要发生什么,只是不清楚我们如何才能使其奏效。
LJ:上次我们谈话时,我给人的印象是 db4o 用户非常清楚这种阻抗失配,这就是为什么他们贡献了解决这个问题的代码和请求,而不是迫使您接受 SQL 模型。我理解对了吗?
Christof:是的,发生的事情是一些经理希望在他们的评估电子表格中看到“SQL”旁边的复选标记。然而,OO 开发人员不希望使用 SQL 访问他们的数据,除非他们不得不这样做或不了解其他替代方案。事实上,SQL 是一种 DBA 语言,而不是开发人员语言。我们的开发人员说 Java 和 .NET。因此,db4o 具有“本机查询”,即使用本机 Java 或 .NET 语义查询数据库的能力,这是一种类型安全且 100% 面向对象的方法,例如。
LJ:那么报告呢,例如?
Christof:如果您运行带有 db4o 的分布式应用程序,您通常不需要报告(您会在汽车中运行 Crystal Reports 吗?)。如果您仍然需要在某个阶段将您的数据链接到您的后端 RDBMS,那么您可以使用 db4o 复制系统 (dRS),它使用 Hibernate 将持久化对象同步到中央关系数据仓库以进行分析、备份等。
具体来说,报告实际上可能会走向 OO。Java 领域的几家供应商(Actuate、Elixir、JasperSoft)和 .NET 中的 Microsoft(Visual Studio 2005—ReportViewer)已将 OO 报告工具推向市场。而且,人们可能会发现针对简单的业务对象(例如“客户”)进行报告比针对带有神秘名称的无数规范化表进行报告更容易。
LJ:db4o 如何准确地解决这种阻抗失配?
Ted:db4o 方法与其他 OODBMS 一样,避免了阻抗失配,因为我们不尝试将对象以外的任何东西存储到系统中。换句话说,没有“映射”,就其本身而言,因为没有什么可以映射的。(显然,db4o 内部正在进行一些存储技巧以避免明显的低效率,但这些技巧与任何关系数据库所使用的技巧相同,并且在很大程度上是黑盒且与最终用户的角度无关。)这意味着存储数据的模式是对象本身的模式,从而避免了我在这篇越南文章中提到的“双模式问题”。
Christof:类模型 == 数据库模式。
LJ:可以公平地说,您希望 db4o 看起来像是 Java 的扩展,从而避免阻抗失配吗?这甚至有可能实现吗?
Ted:我不确定我会说它是 Java 的扩展,更像是主要透明的持久化系统。多年来,已经有许多研究项目试图使持久化完全透明,包括 Java 领域的几个项目,他们玩弄了一些有趣的技巧,例如挂钩构造函数以在“new”调用时创建持久化对象,并在调用非默认构造函数时从持久化空间加载对象等等。由于各种原因,这些项目中的大多数都没有走出研究领域,因此我会有点担心建议 db4o“扩展”Java(或 .NET,就此而言)。
Christof:严格来说,你是对的,Ted。但如果我们有一个设计理念,那就是——让我们尽可能透明。让我们尽可能在持久化方面使用 Java 或 .NET 的语义和行为,使其对开发人员来说侵入性最小且最直观。
LJ:那么 db4o 的学习曲线不是很陡峭?
Christof:不。事实上,odbmsjournal.org 上有一个播客(第 2 集)表明,您可以在五分钟内启动并运行 db4o——包括下载!然而,更具挑战性的是,有些人必须改掉坏的(=非 OO)习惯。他们问,“我的主键在哪里?”(OOP 中没有主键。)因此,对我们来说,与年轻的开发人员合作是最容易的,尤其是在亚洲,他们没有精神遗产,并且在编写与持久化相关的代码时,生产力提高了十倍。
LJ:当我与数据库设计师和程序员交谈时,我经常听到他们赞扬像 PICK 这样的多值数据库。您的用户和开发人员是否要求提供多值字段?
Ted:我的经验有所不同——多值数据库笨拙且难以使用。我认为最终推动讨论的是一个人自己的经验是什么,以及你认为什么是显而易见和直观的。就我个人而言,我认为 Date 会同意这一点,多值字段是可憎之物,应该避免,因为我个人非常相信关系模型在数据存储和操作方面的力量。
LJ:这与 O/R 映射有何关系?这会带来更多问题吗?
Ted:在某些方面,不会,因为它“只是”一个 List(或其他集合)作为类的属性存储。但在其他方面,这将给 O/R-M 工具带来重大问题,因为现在试图决定类内部的 List 是否应该映射到多值字段还是与另一个表的关联将需要在字段上添加另一个注释/属性来控制映射,从而在对象模型和数据库模式之间创建更多耦合。
LJ:Java 的 GPL 化在任何方面影响了您的工作吗?它给您的业务带来了问题还是机遇?
Christof:事实上,Java 的 GPL 化,Java 的双重许可,对 db4o 来说是个好消息,原因有三。首先,Java 的开源肯定会促进 Java 生态系统,从 IBM 到 Eclipse,再到许多开源项目和初创公司。其次,通过开源,我们可以期待将 db4o 的持久化解决方案与 Java VM 进行比以前更紧密的集成。第三,MySQL、db4objects、Trolltech 和许多其他公司使用的双重许可模式本身已进一步获得认可,成为一种可行的开源商业模式,这也使我们作为公司的生活变得更加轻松。
LJ:您的客户对 Java 即将 GPL 化的事实有何反应?您是否看到对 Java 的兴趣增加或减少?对 db4o 的兴趣减少或增加?
Christof:在过去几个月中,我们看到 db4o 的 Java 用户大幅增加,无论是绝对数量还是相对于我们的另一个平台 .NET 的比例。我们真的不知道这是否与 Java 的开源有关,但这将提供一个很好的解释。
LJ:非常感谢您抽出时间和精力与我们交谈。
Nicholas Petreley 是 Linux Journal 的主编,曾是一名程序员、教师、分析师和顾问,在过去十年中一直从事 Linux 的工作和写作。