知识卡片
阻抗不匹配与文档模型的局部性优势
内容
用面向对象语言开发应用时,如果数据存储在关系表中,就需要一层笨拙的转换代码,处理 应用代码里的对象和数据库里的表/行/列之间的转换——这种模型间的不连贯被称为”阻抗 不匹配”(借自电子学:电路阻抗不匹配会导致信号反射和功率损耗,类比数据模型不匹配 带来的转换损耗),ORM框架能减少转换所需的样板代码,但不能完全消除两个模型之间的 根本差异。文档模型(如JSON)对”一对多关系树”这类数据结构(比如一份履历里的多段 工作经历、教育经历)天然贴合,因为这类数据本身就是一棵树,用JSON表示时这个树状 结构变得显式,而不像关系表那样要拆成多张表用外键关联。文档模型还有一个直接的性能 收益——局部性:JSON文档通常以单个连续字符串形式存储,如果应用经常需要一次性访问 整份文档(比如渲染成一个页面),文档模型只需一次查询就能取到所有相关信息;而关系 模型下同样的数据分散在多张表里,取一份完整履历需要多次查询或复杂的多表连接,需要 更多次磁盘查找、耗时更长。但局部性优势是有前提的:它只在”确实需要文档绝大部分内容” 时才成立,如果只想访问文档里的一小部分字段,数据库依然要加载整份文档,对大文档而言 反而浪费;而且更新文档通常需要整体重写,只有不改变文档大小的修改才能容易地原地 执行,因此局部性收益是用”文档要保持相对小、避免频繁做增大文档的写入”这个约束换来的。
参考来源
- 位置:《数据密集型应用系统设计》第二章《数据模型与查询语言》"关系模型与文档模型"
及"查询的数据局部性"(源文件:_epub-src/ch2_split_001.html, ch2_split_002.html)
- 结论依据:原文说明ORM框架不能完全隐藏对象和关系模型之间的阻抗不匹配,JSON表示
比多表关系模式具有更好的局部性、一对多关系隐含树状结构,并说明局部性仅适用于
需要文档绝大部分内容的情况、更新通常需要整体重写,直接支撑本卡片结论。
- 原始内容:模型之间的不连贯有时被称为阻抗不匹配……JSON表示比图2-1中的多表模式
具有更好的局部性……局部性仅仅适用于同时需要文档绝大部分内容的情况……更新文档时,
通常需要整个重写。只有不改变文档大小的修改才可以容易地原地执行。