
《孙子兵法》有句话“知彼知己百战不殆。” 做系统设计也是这个道理——先把数据的彼和己弄清楚后面少走很多弯路。最近在看 AzerothCore 的数据库设计最先吸引我注意的就是它的三库分离Auth、Characters、World。三个库各管各的事互相不掺和。这种设计在游戏服务端里挺常见但 AzerothCore 做得格外干净值得专门说一说。先从图书馆讲起。这个类比我写的时候想了半天觉得确实是最好懂的方式。你去图书馆办借阅证图书馆会同时维护三套记录你的账户信息名字、电话、押金、有没有欠款图书馆的书每本书在哪个书架、现在能不能借你的借阅流水借了哪本书、什么时候还这三套数据各有各的更新节奏——你换手机号只动账户一本书被还回来只动书目借阅记录长期归档基本不动。混在一张表里会怎样权限没法分备份没法差异化想单独扩容其中一个都难。游戏服务端的问题一模一样。MMO 里天然就有三类性质完全不同的数据认证数据能不能进来有没有权限——基本不变角色数据背包装了什么任务做到哪了——随时在变世界数据地图上有哪些怪任务怎么设计——上线之后很少动所以大型游戏服务端基本都选了分库AzerothCore 也不例外。三库分工大概是这样的数据库干什么的变化频率代表表Auth验证账户、权限控制低account、realmlistCharacters存玩家的角色状态高characters、character_inventoryWorld游戏内容配置全服共享极低creature_template、quest_templateAuth 库说白了就是守门的。它只管一件事你是谁你能不能进来。account表存用户名和加密后的密码这是整个游戏的入口。realmlist存每个服务器的地址和端口你选哪个区、哪个服全看这张表。account_access记录 GM 权限等级不同等级能执行的命令不一样。有个有意思的细节玩家登录之后Auth 库基本就不再被访问了。服务端拿到验证结果后续游戏里的操作全走 Characters 和 World。Auth 库的压力不会随在线人数涨稳得很。Characters 库是三库里最活跃的。玩家在游戏里做的几乎所有事情——打怪、任务、换装、社交——最后都会写进这个库。characters是角色主表名字、职业、等级、当前位置都在这里。character_inventory存背包和银行里的物品注意这里每件物品都有唯一 ID不是简单存个数量。character_queststatus存任务进度每个角色都有一套自己的任务状态不是大家共享一套模板。其他的还有character_spell和character_talent法术和天赋、character_reputation声望、guild_member公会。有个我挺喜欢的表——calendar_events游戏里的日历活动团队副本什么时候开、公会活动怎么安排都靠它。竞技场的战队系统 (arena_team)、邮件 (mail) 也都在 Characters 库里。因为变更最频繁Characters 库往往是多服架构里第一个需要分库或者读写分离的地方。World 库存的是游戏内容的设计图纸全服玩家共享一份。这和 Characters 库最大的区别就是Characters 库是每个人一套数据World 库里所有人都用同一份。比如creature_template生物模板表定义每种怪物长什么样——等级、血量、掉什么、施放什么法术。这是一份模板服务器上所有同类型的怪都引用它。creature表存的则是具体的实例每只怪出现在哪个坐标、刷新间隔是多少。还有quest_template任务配置、item_template物品属性、gameobject_template宝箱、矿点、传送门这类对象。conditions表很有意思它把很多表串联起来做跨表的条件判断——比如只有完成了 A 任务才能接 B 任务就是靠它实现的。World 库上线之后基本不怎么动所以天然适合做读写分离——大量玩家在读查怪物数据、看任务文本但很少有人写。整理完三库设计我发现 AzerothCore 的数据分层比很多商业游戏还要清晰——光这一点就值得继续往下看。