深入学习 ODB(五):继承策略与 View 的强大抽象
系列导航:编译器与注解 | 连接与事务 | 对象关系 | 类型安全查询 | 继承与视图(本文) | 迁移与多库 | 性能与实践 | 实战项目 引言:道具系统的继承难题 游戏中的道具系统天然适合用继承建模: 1 2 3 4 Item(道具基类) ├── Weapon(武器) — 攻击力、攻速、暴击率 ├── Armor(防具) — 防御力、抗性、耐久度 └── Consumable(消耗品)— 恢复量、冷却时间、持续时间 在 C++ 中,这是一个干净的继承体系。但映射到关系数据库时,问题来了——关系数据库没有继承的概念。一张表怎么存不同子类的字段?ODB 提供了三种策略来解决这个问题,各有取舍。 此外,游戏运营经常需要统计数据——“全服多少人在线”、“公会战力排名”、“每日交易额”。加载完整对象再聚合太慢了,ODB 的 View(视图)让你直接获取投影和聚合结果,不产生完整对象。 1. 继承映射三策略 1.1 共同的基类定义 三种策略使用相同的 C++ 继承体系,只是 pragma 配置不同: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // item_base.hxx — 道具基类(所有策略共用) #include <string> #include <cstdint> #include <odb/core.hxx> // 道具品质枚举 enum class ItemQuality : int { White = 1, // 白色 - 普通 Green = 2, // 绿色 - 优秀 Blue = 3, // 蓝色 - 精良 Purple = 4, // 紫色 - 史诗 Orange = 5 // 橙色 - 传说 }; 1.2 策略一:单表继承(Table Per Hierarchy) 所有子类共用一张表,通过鉴别器列(discriminator)区分类型: ...