深入学习 ODB(三):对象关系——一对一、一对多与多对多
系列导航:编译器与注解 | 连接与事务 | 对象关系(本文) | 类型安全查询 | 继承与视图 | 迁移与多库 | 性能与实践 | 实战项目 引言:从单表到关系网络 前两篇我们学会了单个 Player 对象的持久化。但真实的游戏系统远不止一张表: 1 2 3 4 5 6 7 Player ──── 1:1 ────▶ PlayerProfile (玩家档案:头像、签名、战斗统计) │ ├─── 1:N ────▶ InventoryItem[] (背包:拥有多个道具) │ ├─── 1:N ────▶ Equipment[] (装备栏:穿戴的装备) │ └─── M:N ────▶ Guild[] (公会:多个玩家加入多个公会) 在关系数据库中,这些关系通过外键表达。而在 C++ 中,我们习惯用指针和容器表达。ODB 的工作就是在这两种世界观之间架起桥梁。 本篇将逐步讲解 ODB 如何用智能指针和 STL 容器映射所有类型的对象关系。 1. 关系映射基础概念 1.1 数据库外键 vs C++ 指针 数据库世界 C++ 世界 ODB 桥接方式 外键列(player_id BIGINT) std::shared_ptr<Player> ODB 自动处理 load/persist JOIN 查询 解引用指针 ptr->name() 延迟或急切加载 联接表(junction table) std::vector<shared_ptr<T>> ODB 自动维护联接表 1.2 ODB 的指针类型选择 ODB 支持多种指针类型来表达对象引用: ...