强关联架构 之前说过强关联数据的复杂情况( 涵盖有交叉切库和多表关联的关系 ), 当时想着早晚会遇到这种需求, 没想到这么快就遇到了.
这里涉及到的有以下关联:
游戏服务器组(ServerGroup): 将大量服务器分组, 每个组关联多个服务器放置在同个数据库, 该数据库对应组ID 游戏服务器(Server): 游戏服务器, 放置设计游戏关联信息的 渠道来源(Channel): 来源渠道, 比如快手|抖音|微信或者商店对应来源渠道 后台管理员(User): 后台管理员, 不同管理员关联不同渠道|不同服务器|不同权限等 后台权限(Auth): 访问权限, 管理员的权限各有不同 这里强烈这种需求尽可能 不要用脚本语言去实现, 特别是弱类型语言维护坑太多了; 复杂关联数据本身就很绕了, 还要处理数据类型传递验证且没有常驻数据连接池访问的问题.
弱类型后续维护坑太大了, 主要是弱类型写着最后传递过来的类型分不清是 int|string|null 哪种, 不注意的时候传递类型直接被修改都不清楚情况.
这里关联数据的方式先说明, 这里授权采用传统 RBAC 建模, 单个用户关联多个角色, 角色有:
用户登录后台(User 检索数据) 判断用户是最高管理员或者普通管理员( 只有最高管理员默认拥有所有权限 ) 获取关联角色|分组( Group|Role 检索关联 ) 通过角色|分组关联获取权限( Auth 检索菜单和接口权限 ) 通过角色|分组关联获取渠道( Channel 检索关联渠道 ) 通过角色|分组关联获取服务器( Server 检索关联服务器 ) 后续所有数据都要去 ServerId IN (1,2,3) AND Channel(1,2,3,4) 这里追加条件, 单单要建立这里面关联就需要以下表:
# 管理员表, 最基础简单的账户表 CREATE TABLE IF NOT EXISTS `user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `username` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号名', `nickname` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '昵称', `salt` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '盐值', `password` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '哈希密码', `token` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权Token', `created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', `created_uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建管理员', `created_ip` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建IP', `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', `updated_uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新管理员', `updated_ip` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新IP', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='管理员账户表'; # 管理员对应分组, 给后台划分角色类型, 比如策划|主管|客服等角色 CREATE TABLE IF NOT EXISTS `user_group` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色组名称', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='管理员角色组'; # 用户权限表 CREATE TABLE IF NOT EXISTS `user_auth` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `pid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '等于0标识父级节点, 大于0是关联的父节点', `ty` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '菜单类型, 0 默认为菜单页面, 1 为API隐藏接口类型', `name` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限名', `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限路径', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='管理员权限表'; # 对应渠道来源, 比如快手|抖音|微信|H5等 CREATE TABLE IF NOT EXISTS `channel` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `channel_id` bigint(20) unsigned NOT NULL COMMENT '第三方渠道定义', `name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道名称', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='渠道分类'; # 服务器列表 CREATE TABLE IF NOT EXISTS `server` ( `id` bigint(20) unsigned NOT NULL COMMENT '服务器ID, 需要运维定义', `name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '服务器名称', `created_at` int(10) unsigned NOT NULL COMMENT '创建时间', `created_uid` bigint(20) unsigned NOT NULL COMMENT '创建管理员', `created_ip` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创建IP地址', `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', `updated_uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '更新管理员', `updated_ip` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新IP地址', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='服务器列表'; 这就是基础的信息表, 需要留意基础表数据千万 不要硬删除, 否则会出现关联数据关联错误, 而是采用字段软删除才能保证数据关联; 之后关联的表数据用于 role|group 这些分组ID来检索关系: