Orm I';我真的不相信对象关系阻抗不匹配吗?

Orm I';我真的不相信对象关系阻抗不匹配吗?,orm,Orm,我曾经参与过几个项目,他们都使用了以数据库为中心的设计,看起来效果不错 这似乎是一个蓬勃发展的新想法,现在看来还不错,但它的价值还需要考验,还是我错了 对象关系阻抗失配与关系数据库和面向对象软件模型之间的差异有关。如果您没有看到任何不匹配,那是因为您的代码没有真正正确地执行OO 当您开始正确地执行OO,并尝试将这些关系映射到RDBMS时,您就会明白问题所在。对象-关系不匹配的概念来自于您尝试使用关系数据库支持的面向对象编程方法时出现的问题。问题产生于这样一个事实,即对象模型通常包含需要分解成多个

我曾经参与过几个项目,他们都使用了以数据库为中心的设计,看起来效果不错


这似乎是一个蓬勃发展的新想法,现在看来还不错,但它的价值还需要考验,还是我错了

对象关系阻抗失配与关系数据库和面向对象软件模型之间的差异有关。如果您没有看到任何不匹配,那是因为您的代码没有真正正确地执行OO


当您开始正确地执行OO,并尝试将这些关系映射到RDBMS时,您就会明白问题所在。

对象-关系不匹配的概念来自于您尝试使用关系数据库支持的面向对象编程方法时出现的问题。问题产生于这样一个事实,即对象模型通常包含需要分解成多个表并从多个表重建的对象层次结构,而不是将对象作为一个整体存储

然而,在这一点上通常出现的论点是,如果你没有发现问题,那是你的错,因为你没有做“正确”的对象定向,当你学会“正确”做对象定向时,你会发现不匹配。我们都知道面向对象是唯一“合适”的开发模式

哦,等等

许多系统不适合作为面向对象系统建模。事实上,对于像web应用程序这样的总体复杂度较低(局部复杂度较高)且需要高并发性和可伸缩性的应用程序,使用面向服务和消息传递技术可能是更好的选择。当以这种方式编写应用程序时,您往往会发现没有太多的对象关系不匹配,因为您不使用延迟加载和复杂的对象层次结构之类的东西,而且您的对象是不可变的,因此不需要将它们分解回数据库


那么是否存在对象关系不匹配?是的,如果您尝试在关系数据库中使用面向对象技术。但是,如果其他方法更适合您的应用程序,您可以通过不使用面向对象技术来缓解这种情况。

如果您的域模型很简单,并且没有深度继承,您可能永远不会感觉到阻抗失配

例如,假设类Foo定义了属性Foo。Bar是Foo的子类,并引入了一个属性栏。如何在数据库中存储foo和bar

您可以有一个包含字段Foo和bar的表Foo。。。每个Foo都会满足“bar为NULL”。但是如果你的子类引入了一大堆属性,那是浪费

所以也许你有两张桌子,一张桌子是Foo,一张桌子是Bar。您是否将Foo中的所有列复制到Bar中,以便在一次选择中加载整个Bar?或者你必须加入Foo和Bar来加载一个Bar


阻抗指的是,你必须考虑所有这些关于如何将一个对象“切碎”(使用Greg Beech的术语)到一个或多个表中的小细节。

好的,设计是以数据库为中心的,但代码是正确的OO吗?通常不是,但对于未来的项目,我希望如此。只有当项目的一部分以一种方式编写,另一部分以另一种方式编写时,阻抗才能体现出来:因此,您的数据库有一个关系模型,以及一个基于对象的域模型。呃,消息传递是OO设计中最具定义性的特征。OO中没有任何内容阻止不可变对象。面向服务的系统在很大程度上只是面向对象的。@Pete-不知道你是如何得出这个结论的;我认为ad-hoc多态性是OO设计最具决定性的特征。我应该提到,它在我所描述的建筑类型中也没有位置。虽然OO不能阻止不可变的对象,但用完全不可变的对象构建面向对象的系统是不典型的。我不确定你最后一句话的意思,所以我不能反驳。艾伦·凯(Alan Kay)曾说过信息比封装更重要,所以除非你在瑞典阵营,否则这已经足够好了(没有信息,你不可能有特别的多态性)。在SOA中,您有一个不透明的句柄(例如URI)并将消息(例如XML文档)传递给它。接口被定义,实现被隐藏。这只是OO,但更大。