当前位置: 首页 > news >正文

AzerothCore学习笔记·数据库05:模板表设计——核心字段演化逻辑

数据库设计课上有一条铁律:宽表是坏味道。

字段多到几十上百行,不同类型的实体挤在同一张表里——这是"反范式",是设计缺陷,是迟早要还的技术债。

然后你去看 AzerothCore 的item_template:接近两百个字段;creature_templateitem_entry表有 50+ 字段,外加creature_template本身 100+ 字段。两张核心表,每张都宽到离谱。

为什么?

答案要从 WoW 里到底有多少种东西说起。


一个表要描述多少种东西

AzerothCore 里有 25000+ 种怪物,20000+ 种物品。这 25000 种怪物差异极大:有的会施法,有的不会;有的是人形,有的是亡灵,有的是机械;有的掉金币,有的不掉。

如果严格按范式设计,应该拆成creature_template_base+creature_template_spells+creature_template_loot+creature_template_ai…… 拆十几张表,每种怪物只填充其中几张。

问题是:查询时要 JOIN 十几张表。怪物数据在游戏里是高频读取的——每只怪刷新时都要读模板。JOIN 十几张表,在 MMO 这种高并发场景下,性能代价是不可接受的。

物品的情况更极端。武器有伤害和速度,消耗品有使用效果和冷却,任务物品要关联任务ID,配方有技能要求——每种物品类型的字段集合完全不同。如果按类型拆表,item_template_weapon+item_template_armor+item_template_consumable…… 光是物品类型就有几十种,查询时要不 JOIN 很多表,要不写复杂的 UNION。


creature_template 的字段分类

宽表不是乱放。两百多个字段拆开看,分几大类:

基础属性entry(模板ID)、name(名称)、faction(阵营)、npcflag(NPC功能标志)

战斗属性mindmg/maxdmg(伤害范围)、attackpowerhealth/manaarmor

模型相关modelid1~4(模型ID,最多4个,用于随机选模型)、HealthModifier/ManaModifier

AI相关AIName(AI类型:NullAI、ReactorAI、PassiveAI、AggressorAI……)、ScriptName

掉落相关lootid(掉落表ID)、pickpocketloot(偷窃掉落)、skinloot(剥皮掉落)

其他spell(施放的法术列表)、movement(巡逻路径类型)、种族/职业限制(主要对玩家生效的NPC)

大部分字段对大部分怪物来说是 NULL 或默认值,但它们都在同一张表里。

拿一个具体例子:一只普通森林狼,modelid1=17550mindmg=9maxdmg=13spell=0AIName=NullAI——其余字段全是 NULL。但查这只狼时,一次 SELECT * 搞定,不用 JOIN 五张表。


宽表的取舍:空间换时间

AzerothCore 的选择:一个表,所有字段,用 NULL 表示"这个字段对我无效"

好处很明显:一次 SELECT * 就能拿到这只怪物的全部数据,不需要 JOIN。磁盘空间便宜,CPU 和延迟贵——对于 MMO 服务端,这是正确的取舍。


字段是怎么"长"出来的

item_templatecreature_template的字段不是一次性设计好的,而是随着 WoW 的每一次资料片逐步加出来的。

原版(2004):基础字段——名字、等级、属性
燃烧的远征(2007):加了韧性、法术穿透
巫妖王之怒(2008):加了成就相关字段
大地的裂变(2010):加新种族/职业兼容
后续资料片:持续加新字段……

如果去看creature_template的字段列表,会发现一些"奇怪"的字段——只对某个资料片的某种怪物有意义,但字段留在表里没人删。删字段是破坏性操作,所有已有的 template 数据都要迁移,成本远高于留着几个 NULL 字段。

这不是设计懒惰,而是演化式架构的必然结果:系统活着,需求在变,表结构只能加,很难减。


dbdocs:字段级的文档系统

字段越来越多,新人看表结构会完全懵掉——这个字段是干嘛的?默认值是多少?

AzerothCore 在data/sql/dbdocs/目录下给 World 库每一张表的每一个字段写说明。如果你想知道creature_templateAIName字段取什么值、是什么意思,直接查 dbdocs,不用翻代码或猜。

数据库 schema 本身不包含业务语义。AIName的值是字符串(“NullAI”、“PassiveAI”、“AggressorAI”……),这些字符串的含义只能在文档里说清楚。dbdocs 把这件事系统化了:每个字段有中文说明、取值范围、默认值、联动关系。对于 World 库这种"配置驱动"的库来说,这比写再多代码注释都管用。


为什么 Characters 库的表反而窄

回过头看,characters主表大概 50 个字段,character_inventory只有 10 个左右。

原因很简单:Characters 库里的每张表描述的是一个明确、稳定的概念。"角色"这个概念不会突然多出十几个新维度;"背包里有个物品"这个关系也很稳定。

World 库的模板表描述的是"游戏内容"——这是会持续膨胀的。每一次资料片加入新机制,都可能在模板表里加字段。

这就是「配置」和「状态」在表设计上的根本差异:配置表跟着游戏内容走,只会越来越多;状态表跟着玩家行为走,结构是稳定的。


回到开头的悖论:数据库课说宽表是坏味道,MMO 场景说宽表是正确选择。两者都对——因为场景不同,取舍就不同。AzerothCore 的模板表设计,本质上是对"读多写少、配置驱动、容忍 NULL、拒绝 JOIN"这四个原则的正确执行。这套取舍同样体现在 AzerothCore 的条件系统里——下篇聊的conditions表,是 World 库里最精巧的一张表。

http://www.jsqmd.com/news/994933/

相关文章:

  • [实战] 2026年供应链质量管理(SQM)数字化转型:从图纸识别到检验计划自动化
  • 2026肇庆电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • 2026马鞍山企业业主高频选择的 5 家危房检测房屋结构安全鉴定机构实地测评整理 - 科信检测
  • 2026漳州企业业主高频选择的 5 家危房检测房屋结构安全鉴定机构实地测评整理 - 科信检测
  • 工业级遗传算法实战:多样性维持、约束处理与自适应收敛
  • 20260611 之所思 - 人生如梦
  • 2026呼和浩特电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • LabVIEW软管脉冲疲劳试验
  • 终极DS4Windows配置指南:让PlayStation手柄在PC上完美运行
  • 2026玉林企业业主高频选择的 5 家危房检测房屋结构安全鉴定机构实地测评整理 - 科信检测
  • 2026宁波市北仑区家里卫生间漏水、阳台漏水、楼顶漏水、阳台漏水、地下室渗水、阳光房漏水各种房屋漏水情况不用愁!售后无忧,线上质保可查。本地防水补漏公司为您排忧解难! - 防水百科
  • MATLAB电力系统稳态分析工具包:含潮流与最优潮流计算功能,支持2021–2024版
  • 2026六安电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • 【轨迹跟踪】基于Rovere的滑移引导轨迹跟踪附Matlab代码
  • 2026黄山市民优选 5 家水质检测服务机构 饮用水污水废水检测实地走访测评整理 - 中安检测集团
  • 2026重庆企业业主高频选择的 5 家危房检测房屋结构安全鉴定机构实地测评整理 - 科信检测
  • 为创维e900v22c电视盒子构建CoreELEC媒体中心系统
  • 基于蔡格尼克效应的消费激励模型设计与落地分析
  • 2026来宾电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • 2026荆门电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • 遗传算法工程化实践:从教科书到电商多目标优化
  • 2026运城电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • 工程单据Agent采购避坑:无节点追踪产品如何利用实在Agent实现溯源追责?
  • 2026江门市民优选 5 家水质检测服务机构 饮用水污水废水检测实地走访测评整理 - 中安检测集团
  • 2026江苏企业业主高频选择的 5 家危房检测房屋结构安全鉴定机构实地测评整理 - 科信检测
  • 2026呼和浩特市民优选 5 家水质检测服务机构 饮用水污水废水检测实地走访测评整理 - 中安检测集团
  • Pandas多维聚合实战:从pivot_table到张量建模
  • AI漫剧软件厂商怎么选?五步决策路径及行业格局全解析 - 速递信息
  • okbiye 论文降重降 AIGC:多档位双效优化方案,一次性解决查重与 AI 标记双重难题
  • 固件自动解析芯片手册生成驱动代码