方便网页游戏合服的数据库设计思路

合服应该算是游戏生命周期中的一环,很多游戏开发者都会经历这个过程,而根据我自己的经验,网页游戏合服更为普遍和频繁。我经历过合服的痛苦历程,甚至听说过有些游戏由于最初的设计原因导致无法合服。当然真正的无法合服应该是不存在的,我想大概是因为这个痛苦超过了常人的忍受能力,或者是这个过程成本过高。 所以说,我们最好在早期开发过程中就预先考虑好这个问题。

环境说明

以下的内容直接使用 MySQL 的术语和语句,不过就算你使用其他数据库,也应该很容易理解这些概念。

主键冲突

合服时遇到的最普遍情况当属主键冲突。

玩家角色、道具等等都是在游戏运行过程中添加进去的数据,我们用数据库的 AUTO_INCREMENT 特性来创建这些数据的主键,来保证他们在游戏中的唯一性。 比如我们定义了玩家的ID字段为 uid int(11) NOT NULL AUTO_INCREMENT ,那么玩家的道具表中势必也会有一个字段 uid int(11) NOT NULL ,用来表明这个道具是哪个玩家的,类似的,玩家的装备等等也会用类似方法表明归属。

当合服时问题就来了,AUTO_INCREMENT 只能保证数据在这个服务器中唯一,最终导致服务器 A 中有个玩家的 uid 是 1 ,服务器 B 中也有个玩家的 uid 是 1 ,在解决这个冲突前是不能合服的。

我们常常采用的方法就是把服务器 B 中的所有 uid 都加上一个数,以保证服务器 B 中最小的 uid 也比服务器 A 中的大,这样就把冲突解决了,当然还要做一些其他工作,因为玩家表中 uid 改了,所以道具表中的 uid 也要做相应的修改,以保证合服后道具还属于原来那个玩家,然后还有装备表等等要如法炮制。如果你使用了外键,还得加上删除和重做外键的步骤。

同时,道具表和装备表等又有自己的主键冲突要解决,表越多,表之间的关系越复杂,修改一个表的主键牵涉到的相关表也就越多。虽然解决问题的规则和方法很简单,但实际操作起来,这样一层层套在一起简直让人疯狂。

主键冲突的避免

通过上面的描述,主键冲突产生的原因和解决主键冲突的方法都已经很明了了。那么与其每次这么手动去处理,不如把这个解决的方法提前到数据库产生数据前。

首先,我们给每个服务器一个编号,我想这很容易,服务器本来就是一服二服这么下来的。 然后预估每个表最多会有多少数据:比如我预计我们一个服务器不会达到1亿个玩家,那么用服务器编号乘上这个预估的数,比如 1 服,就是 1 x 100000000 = 100000000 ,2 服就是 2 x 100000000 = 200000000。在开服前我们用 ALTER TABLE x AUTO_INCREMENT = y 把 AUTO_INCREMENT 的字段设定从这里开始计数。这么一来,合服时就不会出现主键冲突了。

事实上,我很懒,懒得去给每张表估计最多会有多少数据;也很胆小,不想承担数据量超过我预估的值的风险。 所以我干脆预估所有表都是 100 亿,事实上这已经超过了 int(11) 的最大值,就没什么好担心的了。 我们要做的就是把原来使用的 int(11) 改成 bigint(20)。

别怕太大,硬盘很便宜,AUTO_INCREMENT 也不用你去数。 牺牲那么点存储空间,换得我们开发人员的安枕无忧,我觉得太划算了。

更多

12KB的Excel导出库sheetex是怎么来的

这是一个关于前端 Excel 导出库 sheetex 的故事:我为什么要做这个库,它为什么会这么小,以及你是否值得一试。 如过你问我“为什么非要在前端导出”,那将是另一个故事。 我的数据导出史 不知道你是否还记得自己是从什么时候开始接触数据导出的? 我对自己的“数据导出史”还算有些印象:在还没有正式工作的时候,如果有人问我要数据,我会在数据库管理工具里写个查询语句,然后视对方的用途,导出成SQL 语句、CSV 文件或者Excel 等;待到工作了,需要开发面向最终用户的系统,就不能再这么手工处理,导出功能成为系统标配,用户点击一个按钮,就要下载到相应的文件。 最早是 CSV 格式,因为其生成相对容易,而且也可以通过 Excel 软件进行查看,加上主要是内部用户,偶有无法打开也只要简单培训就能解决。 但随着用户类型变得广泛起来,这种“偶尔”也逐渐变成无法忍受,那么干脆直接导出 Excel 文件吧,反正开源库也已经成熟,于是使用 SheetJS

By 熊立丁
用 Aria2 & AriaNg 搭建离线下载平台

用 Aria2 & AriaNg 搭建离线下载平台

环境 硬件:Mac Mini 2014 4C4G 操作系统:Debian 12 IP地址:192.168.2.2 流程 1. 切换到管理员权限 su root 2. 安装 aria2 apt install aria2 3. 以服务的形式运行 aria2 aria2c --enable-rpc --rpc-listen-all=true --rpc-allow-origin-all --enable-rpc 启动 rpc 服务 --rpc-listen-all=true 允许从任意 IP 访问 --rpc-allow-origin-all 允许浏览器跨域访问 4. 配置 nginx 增加站点用于放置前端界面

By 熊立丁
浙ICP备15043004号-1