知识卡片
嵌入值与序列化LOB的选型判据:能否用SQL查询依赖者内部值
内容
嵌入值把一个小对象(如金钱、日期范围这类没有ID、天然不该单独建表的值对象)的字段直接摊平进所有者记录里,依赖者自己没有持久化方法,全部读写都由所有者代劳——本质上是依赖映射的一种特殊情况。判断该不该用嵌入值,作者给出一个清晰的判据:几乎所有值对象都该用嵌入值持久化,因为它们从不需要对应的表;而对于订单/发货这类引用对象,是否值得用嵌入值则是一片灰色地带,关键要看这份数据脱离宿主上下文后是否还有独立意义、以及是否需要脱离宿主单独用SQL查询它。嵌入值和序列化LOB常常面对同一批候选场景,判断逻辑高度重合,但两者最大的分野在于:能不能用SQL查询依赖者内部的值——嵌入值的最大优势正是允许SQL查询直接命中依赖者对象里的字段(这一点在XML及基于XML的SQL查询普及之前尤其关键,对独立报表机制意义重大);而序列化LOB会把整个依赖者对象图打包压缩进一个字段,SQL完全看不进这个字段内部的结构。因此嵌入值只适合相当简单的依赖者(单个或几个独立值对象都合适),一旦依赖结构变复杂、甚至可能是潜在巨大的对象子图,就该换成序列化LOB——这也是为什么”有多个候选依赖者、数量少且固定”时用嵌入值会让表设计变得凌乱、SQL查询麻烦,此时序列化LOB通常是更好的选择。
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第12章 对象-关系结构模式"之"12.5 嵌入值"(源文件:_epub-src/OEBPS/Text/000123.html、000124.html)
- 结论依据:原文说明"实际上,所有的值对象都应该作为嵌入值来持久化,因为它们从不需要表与之对应……由于很多判断何时使用嵌入值的逻辑和何时使用序列化LOB的逻辑是相同的……嵌入值的最大好处在于它允许SQL查询不遵循依赖者对象中的值……嵌入值只能用在相当简单的依赖者上……序列化LOB则能在更复杂的结构(包括潜在的巨大对象子图)下工作",直接支撑本卡结论。
- 原始内容:嵌入值的最大好处在于它允许SQL查询不遵循依赖者对象中的值……如果想要在查询中使用依赖者值,就真的需要嵌入值。