直接回答:对象-关系阻抗不匹配指面向对象模型与关系模型在表达方式上的结构性差异:对象有继承、嵌套引用、集合与身份标识,而关系模型只有扁平的表、行与外键,两者没有自然的同构映射,ORM 的本质就是弥合这道鸿沟。
展开解析:差异体现在几个方面:
- 结构:对象的嵌套图 vs 关系的多表扁平结构,一对多/多对多要靠外键和中间表表达。
- 继承:类继承在表里只能用单表继承、类表继承、具体表继承等策略折中,各有冗余或 JOIN 代价。
- 标识与相等:对象用引用相等,行用主键相等,同一行可能被加载成两个对象。
- 导航 vs 查询:对象沿引用遍历,关系型用集合运算 JOIN,遍历风格正是 N+1 的温床。
实践启示:ORM 能消除样板 SQL,但隐藏了底层成本,要懂它生成的 SQL;复杂报表查询不必强行走 ORM,可直接 SQL;模型设计时让领域对象适度向关系结构妥协,比强行映射省事。
追问方向:继承映射三策略的取舍、ORM 为何容易引发 N+1。