
1) 【一句话结论】采用“主表(用户表)+关联子表(防沉迷、等级、成就表)”的范式设计,通过外键关联保证数据一致性,为高频查询字段(用户ID、等级、成就ID)建立索引,兼顾查询性能与未来扩展性。
2) 【原理/概念讲解】老师口吻解释核心设计逻辑:
类比:就像“家庭档案”,用户表是“户口本”(核心信息),防沉迷、等级、成就表是“子女成长记录”(关联信息),通过户口本编号(用户ID)关联所有记录,确保信息不丢失且查询快速。
3) 【对比与适用场景】
| 设计方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 合并表 | 将账号、防沉迷、等级、成就字段存入一张表(如用户表包含所有字段) | 数据冗余,查询简单 | 小型项目,数据量少 | 数据更新复杂,扩展性差 |
| 分表(主表+子表) | 主表(用户表)存储核心信息,子表(防沉迷、等级、成就)存储关联数据 | 数据结构清晰,减少冗余 | 大型游戏,数据量多,高频查询 | 需外键关联,查询时可能需JOIN |
4) 【示例】(表结构伪代码):
-- 用户表(主表)
CREATE TABLE user (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
register_time DATETIME NOT NULL,
last_login_time DATETIME
);
-- 防沉迷表(关联用户表)
CREATE TABLE anti_addiction (
record_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
daily_login_time INT, -- 每日游戏时长(分钟)
cumulative_play_time INT, -- 累计游戏时长(小时)
last_update_time DATETIME,
FOREIGN KEY (user_id) REFERENCES user(user_id)
);
-- 等级表
CREATE TABLE level (
level_id INT PRIMARY KEY AUTO_INCREMENT,
level_name VARCHAR(20), -- 如“新手”“青铜”
experience_threshold INT, -- 升级所需经验值
level_attr_add JSON -- 等级属性加成(如攻击+10)
);
-- 成就表
CREATE TABLE achievement (
achievement_id INT PRIMARY KEY AUTO_INCREMENT,
achievement_name VARCHAR(50),
description TEXT,
condition JSON -- 成就达成条件
);
-- 用户成就表(关联用户与成就)
CREATE TABLE user_achievement (
user_id INT,
achievement_id INT,
achieve_time DATETIME,
is_earned BOOLEAN DEFAULT FALSE,
PRIMARY KEY (user_id, achievement_id),
FOREIGN KEY (user_id) REFERENCES user(user_id),
FOREIGN KEY (achievement_id) REFERENCES achievement(achievement_id)
);
5) 【面试口播版答案】(约90秒):
“面试官您好,针对游戏用户系统,我设计采用主表+关联子表的结构。核心思路是:用户表存储账号基础信息,防沉迷表记录每日/累计游戏时长,等级表定义经验值与属性加成,成就表存储成就条件,通过外键关联保证数据一致性。为高频查询字段(如用户ID、等级、成就ID)建立索引,提升查询性能。比如快速查询用户等级,通过用户ID索引直接获取;成就列表通过用户ID关联成就表,JOIN后返回。这种设计既符合范式,又兼顾扩展性,未来新增功能(如社交系统、道具系统)可以新增表或字段,不影响现有结构。”
6) 【追问清单】及回答要点:
7) 【常见坑/雷区】: