知识卡片
属性图模型用顶点与边的两张表建模任意关联数据
内容
[[用ID代替文本实现规范化及其与文档模型的天然冲突]]说明文档模型对多对多关系支持 很弱,当数据里任意事物都可能与任何事物相关联、连接关系变得高度复杂时,把数据显式 建模成图会更自然。属性图模型的结构很简单:每个顶点包含唯一标识符、一组出边、一组 入边、一组键值对属性;每条边包含唯一标识符、起点(尾顶点)、终点(头顶点)、描述 两个顶点间关系类型的标签、以及一组键值对属性。这个模型完全可以用两张关系表实现—— 一张存顶点(含JSON类型的属性列),一张存边(含指向顶点表的外键tail_vertex和 head_vertex、标签、属性),在tail_vertex和head_vertex上建索引就能高效地沿着边遍历 图。这个模型的关键特性有三点:任何顶点都可以有边连到任何其他顶点,没有模式限制哪种 事物能不能关联;给定任意顶点能高效找到它的入边和出边,从而沿着路径前后遍历;通过 给不同类型的关系用不同标签,可以在同一张图里存储多种完全不同类型的信息,同时保持 一个清晰的数据模型。这种灵活性特别适合表达传统关系模式难以清晰表达的场景——比如 不同国家有不同的行政区划层级、不同记录的地理粒度不一致(有的人住址精确到城市, 有的只精确到州)——图模型不需要为这些差异预先设计固定的表结构,直接用带标签的边 表达即可,也让”未来给数据添加新的关联维度”这件事变得容易。
结构图:
flowchart LR
A[顶点表 Vertices] --> A1[唯一ID]
A --> A2[出边集合/入边集合]
A --> A3[键值对属性]
B[边表 Edges] --> B1[唯一ID]
B --> B2[尾顶点 tail_vertex]
B --> B3[头顶点 head_vertex]
B --> B4[关系类型标签]
B --> B5[键值对属性]
A -.tail_vertex/head_vertex索引.-> B
参考来源
- 位置:《数据密集型应用系统设计》第二章《数据模型与查询语言》"属性图"(源文件:
_epub-src/ch2_split_003.html)
- 结论依据:原文详述属性图模型中顶点和边各自包含的字段,说明该模型可以用两张关系
表(顶点表和边表)实现,并列出"任意顶点可连任意顶点""高效遍历""不同标签存储多种
信息"三个重要特性,直接支撑本卡片的结构梳理。
- 原始内容:在属性图模型中,每个顶点包括:唯一的标识符/一组出边/一组入边/一组属性
(键值对)……可以将图存储看作由两个关系表组成:一个存储顶点,另一个存储边……任何
顶点都可以有一条边连接到任何其他顶点。没有模式限制哪种事物可不可以关联。