特征阻抗和阻抗匹配_没有诸如对象关系阻抗不匹配之类的东西

article/2025/9/21 2:24:48

特征阻抗和阻抗匹配

过去十年来,ORM的许多批评都错了这一点,因为它不准确。 到本文结尾,我们将得出以下结论:

关系(数据)模型和面向对象的模型之间没有显着差异

如何得出这个结论? 继续阅读!

我们如何相信这种谬论

许多流行的博客作者和意见领袖都没有机会抨击ORM,因为它们与关系世界的“明显”阻抗不匹配。 N + 1 , 效率低下的查询 , 库的复杂性 , 抽象的泄漏 ,各种流行语已被用来消除ORM,尽管没有提供可行的替代方案,但它们通常包含很多真相。

但是这些文章是否真的在批评正确的事情?

上面的文章中很少有人会认识到一个中心事实,这是Erik Meijer和Gavin Bierman在其非常有趣的论文“ 大型共享数据银行的数据的关联模型 ”中雄辩地幽默地提出的:

与流行的看法相反,SQL和noSQL实际上只是同一枚硬币的两个方面。

换句话说:“分层”对象世界和“关系”数据库世界为完全相同的事物建模。 唯一的区别是在图中绘制箭头的方向。

让它沉入。

  • 在关系模型中,孩子指向父母。
  • 在分层模型中,父母指向孩子。

这里的所有都是它的。

等级与关系

什么是ORM?

ORM填补了两个世界之间的桥梁。 如果您愿意,它们就是箭头逆变器 。 他们将确保RDBMS中的每个“关系”都可以在“分层”世界中实现为“聚合”或“组合”(这适用于对象,XML,JSON和任何其他格式)。 他们确保正确实现此类实现。 可以正确地跟踪对单个属性或关系(聚合,组成)属性所做的更改,并将其清除回持久模型的主模型数据库中。 各个ORM 除了将各个实体映射到各个类型之外 ,在提供的功能以及它们提供多少映射逻辑方面也有所不同。

  • 一些ORM可能会帮助您实现锁定
  • 有些可以帮助您修补模型不匹配的问题
  • 有些人可能只专注于这些类和表之间的1:1映射

但是所有ORM都做一件非常简单的事情。 最终,它们从表中获取行,并将其具体化为类模型中的对象,反之亦然。

顺便说一下,最近在Vertabelo博客上对不同的ORM进行了很好的概述 。

表和类是同一回事

给出或采用1-2个实现细节,RDBMS的表和OO语言的类是同一回事。 一组分组属性的规范,每个属性及其关联的类型。 考虑以下使用SQL和Java的示例:

SQL

CREATE TABLE author (first_name VARCHAR(50),last_name VARCHAR(50)
);

Java

class Author {String firstName;String lastName;
}

两者之间绝对没有概念上的区别-映射很简单。 当您考虑不同实体/类型之间的“关系” /“组成”时,映射甚至非常简单:

SQL(为简单起见,我们省略了约束)

CREATE TABLE author (id BIGINT,first_name VARCHAR(50),last_name VARCHAR(50)
);CREATE TABLE book (id BIGINT,author_id BIGINT,title VARCHAR(50),
);

Java

class Author {Long id;String firstName;String lastName;Set<Book> books;
}class Book {Long id;Author author;String title;
}

省略了实现细节(可能占批评的一半)。 但是,由于省略了更多细节,因此可以将数据库中的各个行直接进行1:1映射,而不会感到惊讶。 大多数ORM(尤其是在Java生态系统Hibernate中)已经很好地实现了上述想法,而隐藏了在RDBMS和Java之间实际进行这种模型转换的所有技术细节。

换一种说法:

这种映射方法绝对没有错!

然而:某处存在* IS *阻抗不匹配

许多博客作者批评的“问题”并非源于两种模型表示形式之间不存在的不匹配(“关系”与“分层”)。 问题来自SQL,它是关系代数的一种不错的实现。

实际上,在以下情况之间也存在着每个人都批评的不匹配现象:

  • 关系模型
  • 关系代数

已经定义了关系代数,以便能够查询关系并形成的特殊关系作为此类查询的输出。 根据所应用的操作和转换,结果元组可能与查询中涉及的各个实体完全无关 。 换句话说,关系代数,尤其是SQL的乘积没有用,因为ORM不再可以对其进行进一步处理,更不用说将其持久化回到数据库了。

为了使事情变得“更糟”,如今SQL是关系代数所提供功能的大型超集。 它比起初设想时有用得多。

为什么这种不匹配仍然会影响现代ORM

前面的段落概述了ORM受到真正批评的唯一主要原因,即使此类批评通常没有提及确切原因:

SQL /关系代数并不是真正适合将关系部分实现到客户端/将更改存储回数据库。 但是,大多数RDBMS只能为该工作提供SQL。

回到作者/书籍示例。 当您想要将作者及其书籍加载并显示给Web应用程序的用户时,您只想简单地获取该作者及其书籍,就可以调用诸如author.add(book)以及author.remove(book)类的简单方法。然后让魔术将您的数据刷新回存储系统。

考虑为这样一个简单的CRUD任务编写SQL代码量会让每个人尖叫。

人生苦短,无法花时间去CRUD

也许QUEL对于CRUD可能是更好的语言 ,但是那艘船已经航行了。 不幸的是,由于SQL是不适合该工作的语言,您不能忽略这种“魔术”,而必须充分了解幕后发生的事情,例如通过调整Hibernate的获取策略 。

转换为SQL后,可以通过几种方式实现:

1.使用JOIN获取

使用外部联接,可以一次性查询所有涉及的实体:

SELECT author.*, book.*
FROM author
LEFT JOIN book ON author.id = book.author_id
WHERE author.id = ?

优点:

  • 可以发出单个查询,并且可以一次传输所有数据

缺点:

  • 作者属性在每个元组中重复。 客户端(ORM)必须先删除作者的重复数据,然后再填充作者与书籍的关系。 当您有多个嵌套关系应立即获取时,这可能特别糟糕。

2.使用SELECT获取

为每个实体发出一个查询:

SELECT *
FROM author
WHERE id = ?SELECT *
FROM book
WHERE author_id = ?

优点:

  • 要传输的数据量很小:每行仅传输一次。

缺点:

  • 发出的查询数量可能会爆发成众所周知的N + 1问题 。

Hibernate尤其了解其他类型的获取策略,尽管它们本质上是上述方法之一的变体/优化。

为什么不使用SQL MULTISET?

在这种情况下,使用高级SQL来获取所有数据的理想方法是使用MULTISET

SELECT author.*, MULTISET (SELECT book.*FROM bookWHERE book.author_id = author.id
) AS books
FROM author
WHERE id = ?

上面的代码实际上将为每个作者创建一个嵌套的集合:

first_name  last_name   books (nested collection)
--------------------------------------------------Leonard     Cohen       title--------------------------Book of MercyStranger MusicBook of LongingErnest      Hemingway   title--------------------------For Whom the Bell TollsThe Old Man and the Sea

如果添加另一个嵌套实体,则很容易看到另一个MULTISET如何允许附加嵌套数据:

SELECT author.*, MULTISET (SELECT book.*, MULTISET (SELECT c.*FROM language AS tJOIN book_language AS blON c.id = bc.language_idAND book.id = bc.book_id) AS languagesFROM bookWHERE book.author_id = author.id
) AS books
FROM author
WHERE id = ?

现在的结果是:

first_name  last_name   books
-----------------------------------------------------Leonard     Cohen       title            languages-----------------------------Book of Mercy    language------------enStranger Music   language------------endeBook of Longing  language------------enfres

优点:

  • 单个查询可以以最小的带宽使用来实现所有渴望加载的行。

缺点:

  • 没有。

不幸的是,RDBMS对MULTISET的支持很差。

MULTISET SQL:2003起 , MULTISET (以及数组和其他集合类型)已正式引入SQL标准中,这是将OO功能嵌入SQL语言的一项举措。 例如,Oracle已经实现了大部分功能,就像Informix一样,或者鲜为人知的CUBRID(尽管使用了特定于供应商的语法) 。

其他数据库(例如PostgreSQL)允许将嵌套的行聚合到类型化数组中 ,尽管需要更多的语法工作,但其工作方式相同。

MULTISET和其他ORDBMS SQL功能是完美的折衷方案,可以将“关系”模型的MULTISET与“分层”模型的MULTISET相结合。 允许一次性将CRUD操作与查询结合在一起,无需复杂的ORM,因为SQL语言可以直接用于将所有数据从(关系)数据库映射到(分层)客户端表示形式,而不会产生摩擦。

结论并号召行动!

我们正在行业中度过激动人心的时代。 房间里的大象(SQL)仍然在这里 , 一直在学习新的技巧。 关系模型为我们提供了很好的服务,并且在各种实现中都丰富了分层模型。 函数式编程越来越受关注,以非常有用的方式补充了面向对象的功能。

想一想胶水,将所有这些伟大的技术概念放在一起,就可以:

  • 在关系模型中存储数据
  • 在分层模型中实现数据
  • 使用功能编程处理数据

如此出色的技术组合很难被击败- 我们已经展示了SQL和函数式编程如何与jOOQ一起使用 。 我们认为,所缺少的只是更好地支持RDBMS供应商提供的MULTISET和其他ORDBMS功能。

因此,我们敦促PostgreSQL开发人员:您正在创建最创新的数据库之一。 Oracle在该领域领先于您-但它们的实现与PL / SQL紧密联系在一起,这使其笨拙。 但是,您错过了最出色SQL功能集之一。 构造嵌套集合(不仅是数组)并有效查询它们的能力。 如果您带路,其他RDBMS也将随之而来。

我们终于可以停止浪费时间谈论对象关系阻抗匹配问题。

翻译自: https://www.javacodegeeks.com/2015/08/there-is-no-such-thing-as-object-relational-impedance-mismatch.html

特征阻抗和阻抗匹配


http://chatgpt.dhexx.cn/article/XqNmwjEy.shtml

相关文章

传输线特征阻抗计算

一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教! 在计算阻抗之前,我想很有必yi要理解这儿阻抗的意义 传输线阻抗的由来以及意义 传输线阻抗是从电报方程推导出来(具体可以查询微…

PCB特征阻抗计算

见教程&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1V4UbEoKfMD1bilwu-Qwdyg 密码&#xff1a;ml6t

射频特征阻抗

Characteris Impendance(特性阻抗&#xff0c;也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一&#xff0c;但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。 &#xff08;如果您检查10个不同的来源&#xff0c;您会看到1…

高速PCB的特征阻抗设计

我们在高速PCB设计当中,经常对高速信号线做特征阻抗控制来优化信号质量。那特征阻抗是什么东西呢? 1.传输线原理 介绍特征阻抗之前,我们复习下《信号完整性视频》介绍的传输线基本原理。如下图左边是低频电路采用集总参数的RLGC模型,右边高频电路采用分布参数的RLGC模型。…

传输线的波阻抗与特征阻抗

以上是时域方程&#xff0c;而我们的“波阻抗”是定义在频域下的&#xff08;正弦激励&#xff09;。 1&#xff09;“相电压/电流”的第一、二项分别代表了前向传输、反向传输分量&#xff1b; 2&#xff09;前向传输和反向传输分量两者无必然联系。 补充修改&#xff1a; 1&…

PCB寄生参数和特征阻抗

1、微带线Microstrip 相同情况下&#xff0c;PCB板厚H越厚&#xff08;影响很大&#xff09;&#xff1a; 特征阻抗越大&#xff08;H↑ > ln()↑ > Z0↑&#xff09;传输延时几乎不变&#xff08;与H无关&#xff09;寄生电感越大&#xff08;H↑ > ln()↑ > L…

传输线的特征阻抗

要理解特征阻抗首先要建立一个模型。传输线零阶模型 在这个模型中&#xff0c;每一个步长是△X&#xff0c;单位长度的电容为CL&#xff0c;所以每个步长的电容 CCL*△X 然后我们根据电荷量 QU*CI*t &#xff0c;电流I Q / t C * U / t&#xff0c;其中t △X / v得到 电流 …

阻抗,特征阻抗与等效阻抗

目录 一、阻抗 二、 特征阻抗 三、等效阻抗 射频的黄金三角之一就是阻抗&#xff0c;我们在射频设计中&#xff0c;会经常与阻抗打交道&#xff0c;比如特征阻抗&#xff0c;负载阻抗&#xff0c;阻抗匹配等等。更多的时候&#xff0c;我们所设计的射频电路就是一个阻抗匹配…

特性阻抗介绍

特性阻抗:又称“特征阻抗”,它不是直流电阻,属于长线传输中的概念。在高频范围内,信号传输过程中,信号沿到达的地方,信号线和参考平面(电源或地平面)间由于电场的建立,会产生一个瞬间电流,如果传输线是各向同性的,那么只要信号在传输,就始终存在一个电流I,而如果信…

单播、广播和多播地址以及组播ip与组播mac间的换算

转自&#xff1a;https://www.cnblogs.com/songdada/articles/4039468.html 除地址类外&#xff0c;还可根据传输的消息特征将IP地址分为单播、广播或多播。主机使用IP地址进行一对一&#xff08;单播&#xff09;、一对多&#xff08;多播&#xff09;或一对所有&#xff08;…

IP组播----组播基础 组播服务模型、组播地址

一、简介 IPv4传输方式有三种&#xff1a;单播、组播、广播 单播&#xff1a;信息源为每个需要信息的主机都发送一份独立的报文组播&#xff1a;信息源将保温发送到一个特定的组播IP地址&#xff0c;只有加入了这个组的主机才能接收广播&#xff1a;信息源将信息发送给网段中…

组播的地址范围

2019独角兽企业重金招聘Python工程师标准>>> 组播的地址是保留的D类地址从224.0.0.0—239.255.255.255&#xff0c;而且一些地址有特定的用处如&#xff0c;224.0.0.0—244.0.0.255只能用于局域网中路由器是不会转发的&#xff0c;并且224.0.0.1是所有主机的地址&am…

组播地址分类 Cyrus

一、组播地址分类 Multicast地址&#xff1a;224.0.0.0-239.255.255.255第一组八位元组为1110 Multicast地址也分为&#xff1a;预留的局部链路地址、全球范围地址、限制范围地址和GLOP地址。 >预留的局部链路地址(reserved link local address)&#xff1a; 保留给本地网段…

IPv6的组播地址

理解IPV6的组播地址 IPv6的组播地址通常是为IPv6的组播服务&#xff0c;而IPv6通信的核心大量的使用了组播&#xff0c;IPv6不再使用广播&#xff0c;这与IPv4的通信不同&#xff0c;然而要理解IPv6的组播&#xff0c;首先需要明白三个关键点&#xff1a; 第一、任何节点都能…

基于udp协议的组播

1. 广播的方式是发送给同一网段下的所有主机&#xff0c;过多的广播数据会占用大量带宽&#xff0c;会造成广播风暴&#xff0c; 影响正常通信; 2. 所以 主机之间一对 一组 的通信模式&#xff0c;即组播&#xff0c;只有加入了同一个组的主机可以收到此组内的所有数据 ; 3.…

IPv4、IPv6地址、组播地址及子网子划分详解四

IPv4、IPv6地址、组播地址及子网子划分详解四 6、IPv66.1、国际IP地址分配方式&#xff1a;6.2、IPv6的结构6.3、IPv6地址简写方式6.4、地址类型6.4.1、单播地址6.4.2、组播地址6.4.3、任意播地址6.5、IPv6接口ID的生成方法 6、IPv6 IPv4地址总数2324,294,967,296 IPv6地址总数…

07-IP组播配置指导

1 组播概述 1.1 组播简介 作为一种与单播&#xff08;Unicast&#xff09;和广播&#xff08;Broadcast&#xff09;并列的通信方式&#xff0c;组播&#xff08;Multicast&#xff09;技术能够有效地解决单点发送、多点接收的问题&#xff0c;从而实现了网络中点到多点的高…

IPv4、IPv6地址、组播地址及子网子划分详解一

IPv4、IPv6地址、组播地址及子网子划分详解一 一、IPv4地址1、IP地址的定义2、IP术语3、IP地址的组成3.1、我们前面讲到IP地址是软件地址&#xff0c;那硬件地址是什么&#xff1f;3.2、IP地址的编址方案4、IP地址的分类4.1、网络地址4.2、保留的IP地址4.3、私有IP地址4.4、组播…

IPV6组播地址

在IPv4中广泛的使用单播、广播、组播的方式。而在IPv6的应用环境中&#xff0c;使用单播&#xff0c;组播、任意播的新方式&#xff0c;放弃广播的使用&#xff0c;换而言之&#xff0c;在IPv6的环境中不再有广播的存在。理解IPv6的组播地址有一个重要的前提&#xff1a;就是读…

IPV4组播地址解析以及IPV4地址详解

为了便于对IP地址进行管理, 根据IPv4地址的第一个字节,IPv4地址可以分为以下五类。 A类:0~127 B类:128~191 C类:192~223 D类:224~239,组播地址 E类:240~254,保留为研究测试使用 IPv4地址中有一些地址段有特殊用途,这些地址段及用途的说明如表所示。 IPV4组播地址解…