51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个用户系统(账号注册、登录、防沉迷)的数据库表结构,并说明关键字段的设计思路(如防沉迷的年龄字段、登录时间戳等),以及如何保证数据的一致性和安全性。

游卡Unity3d开发难度:中等

答案

1) 【一句话结论】用户系统数据库设计需构建用户主表(含密码哈希、年龄)、防沉迷表(含青少年标识、每日累计时长daily_login_duration、累计时长total_login_duration)、登录日志表(含失败次数),通过外键关联与事务保证数据一致性,用BCrypt加密密码,时间戳精确到秒,实现注册、登录及防沉迷功能。

2) 【原理/概念讲解】用户系统核心是数据隔离与关联,用户表作为主表存储用户唯一标识(UUID主键)、密码哈希(BCrypt加盐,避免明文)、用户名、年龄(防沉迷关键字段,需验证12-18岁为青少年)、注册时间及状态(如is_banned,禁用后防沉迷规则不生效)。防沉迷表通过外键关联用户ID,记录登录时间戳(精确到秒)、青少年标识(is_teen,根据age计算)、每日累计时长(daily_login_duration,当天累计时长,凌晨重置)、累计登录时长(total_login_duration,长期累计),用于限制青少年每日登录时长。登录日志表记录每次登录的IP、设备、时间及登录失败次数(login_attempts),用于安全审计和检测暴力破解。数据一致性通过数据库事务(ACID原子性)保证,多表操作时确保要么全部成功要么全部失败。密码哈希的盐随机性防止彩虹表攻击,动态调整哈希成本(work factor)应对计算能力提升。登录日志的失败次数用于触发验证码或封禁IP,提升安全性。比如,防沉迷表像“时间账本”,每日重置像“每日清零”,累计时长像“长期积分”。

3) 【对比与适用场景】

  • 防沉迷时长逻辑对比:

    对比项累计时长(total_login_duration)每日时长(daily_login_duration)
    定义用户长期累计登录时长(秒)当天累计登录时长(秒,每日凌晨重置)
    特性长期累计,不重置每日重置,限制当日时长
    使用场景计算长期防沉迷违规(如连续30天超时)实现每日时长限制(如青少年每天不超过2小时)
    注意点需与每日时长结合判断违规每日凌晨需重置为0,否则计算错误
  • 密码哈希算法对比:

    对比项BCrypt(生产环境)MD5/SHA-1(非生产)
    定义加盐的哈希算法,支持动态调整成本无盐的哈希算法,固定成本
    特性安全性高,抗彩虹表,可动态调整安全性低,易被碰撞攻击
    使用场景生产环境用户密码存储测试环境(非生产)
    注意点需定期更新work factor避免生产环境使用
  • 时间戳精度对比:

    对比项秒级时间戳(Unix时间)毫秒级时间戳(BIGINT)
    定义精确到秒的时间值精确到毫秒的时间值
    特性存储开销小,满足防沉迷计算需求存储开销大,无实际意义
    使用场景计算累计时长、判断超时需要精确到毫秒的业务(如高频交易)
    注意点秒级足以满足需求增加存储成本,需权衡业务需求

4) 【示例】
用户表 (users)

  • user_id: UUID (主键, 自增)
  • username: VARCHAR(50) (唯一)
  • password_hash: VARCHAR(255) (密码哈希值,BCrypt加密)
  • age: INT (年龄, 验证12-18为青少年)
  • register_time: TIMESTAMP
  • is_banned: BOOLEAN (用户是否被禁用,默认false)

防沉迷表 (anti_addiction)

  • user_id: UUID (外键, 关联users.user_id)
  • is_teen: BOOLEAN (青少年标识,根据age计算,12-18为true)
  • daily_login_duration: INT (当天累计时长,单位秒,每日凌晨重置为0)
  • total_login_duration: INT (累计时长,单位秒)
  • last_login_time: TIMESTAMP

登录日志表 (login_logs)

  • log_id: UUID (主键)
  • user_id: UUID (外键, 关联users.user_id)
  • login_time: TIMESTAMP (精确到秒)
  • login_ip: VARCHAR(45)
  • login_attempts: INT (登录失败次数,初始为0)

关联关系:users.user_id → anti_addiction.user_id,users.user_id → login_logs.user_id。

防沉迷每日重置逻辑(伪代码):

-- 每日凌晨执行
UPDATE anti_addiction
SET daily_login_duration = 0
WHERE DATE(last_login_time) = CURDATE();

5) 【面试口播版答案】各位面试官好,关于用户系统数据库设计,我考虑了用户主表、防沉迷表和登录日志表,通过外键关联保证数据一致性。用户表存储用户ID、密码哈希(BCrypt加密,避免明文)、年龄(防沉迷关键字段,验证12-18岁为青少年),还包含用户状态(是否被禁用)。防沉迷表记录登录时间戳、青少年标识,并新增每日累计时长字段(每日凌晨重置),用于限制青少年每日登录时长;累计时长用于长期防沉迷规则。登录日志表记录IP、设备、时间及失败次数,用于安全审计。数据一致性通过数据库事务控制,多表操作时确保要么全部成功要么失败。密码用哈希加密,登录日志的失败次数可检测暴力破解(如连续5次失败触发验证码)。注册时插入用户表,登录时更新防沉迷表的每日时长(计算当天时长)和登录日志,这样既满足注册、登录需求,又能实现防沉迷功能,同时保证数据一致性和安全性。

6) 【追问清单】

  • 问:防沉迷的每日时长限制如何具体实现?比如如何计算当天累计时长?
    回答要点:每次登录时,根据last_login_time和当前时间计算当天时长,更新daily_login_duration字段,每日凌晨通过SQL语句重置为0,确保每日限制逻辑正确。

  • 问:登录失败次数的阈值是多少?如果超过阈值如何处理?
    回答要点:登录失败次数阈值设为5次(连续5次失败),超过时触发验证码或封禁IP,防止暴力破解。

  • 问:BCrypt的工作因子如何动态调整?为什么需要调整?
    回答要点:根据系统负载或CPU性能,定期更新work factor(如每季度调整一次),确保安全性,抵御计算能力提升带来的破解风险。

  • 问:时间戳精度选择秒级的原因是什么?是否会影响防沉迷计算?
    回答要点:秒级时间戳足以满足防沉迷计算需求(如计算当天时长、判断超时),毫秒级会增加存储开销且无实际意义,因此选择秒级。

7) 【常见坑/雷区】

  • 防沉迷表设计错误:仅存储累计时长,未区分每日限制,导致无法实现每日时长限制。
  • BCrypt使用不当:未使用动态调整工作因子,或使用MD5等不安全算法存储密码。
  • 登录失败次数处理阈值未明确:未设定阈值,导致无法有效防止暴力破解。
  • 时间戳精度选择错误:使用毫秒级时间戳,增加存储开销且无实际意义。
  • 事务处理不当:多表操作未用事务,导致数据不一致(如用户表插入成功但防沉迷表未更新)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1