如何设计支持主用户切换子用户账号的数据库结构
主用户可切换子用户账号的数据库设计方案
核心表结构设计
1. 用户表(users)
存储所有用户的基础信息,主用户(管理员/经理)和子用户(员工)共用一张表,通过角色区分:
CREATE TABLE users ( user_id INT PRIMARY KEY AUTO_INCREMENT, -- 分布式场景可改用UUID作为主键 username VARCHAR(50) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role ENUM('admin', 'manager', 'employee') NOT NULL, status ENUM('active', 'inactive') DEFAULT 'active', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
2. 用户从属关系表(user_relations)
维护主用户与子用户的关联关系,支持一对多或多级从属结构:
CREATE TABLE user_relations ( relation_id INT PRIMARY KEY AUTO_INCREMENT, parent_user_id INT NOT NULL, child_user_id INT NOT NULL, relation_type ENUM('direct', 'indirect') DEFAULT 'direct', -- 可选,区分直接/间接下属 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (parent_user_id) REFERENCES users(user_id), FOREIGN KEY (child_user_id) REFERENCES users(user_id), UNIQUE KEY unique_parent_child (parent_user_id, child_user_id) -- 避免重复关联 );
3. 会话切换日志表(user_session_switches)【可选】
记录主用户切换子用户的操作轨迹,用于审计和问题回溯:
CREATE TABLE user_session_switches ( switch_id INT PRIMARY KEY AUTO_INCREMENT, original_user_id INT NOT NULL, target_user_id INT NOT NULL, switch_time DATETIME DEFAULT CURRENT_TIMESTAMP, ip_address VARCHAR(45), user_agent TEXT, FOREIGN KEY (original_user_id) REFERENCES users(user_id), FOREIGN KEY (target_user_id) REFERENCES users(user_id) );
关键业务逻辑实现
- 登录验证:主用户通过
users表验证账号密码,确认角色为admin或manager后,在会话中存储original_user_id(自身ID)和current_user_id(初始为自身ID)。 - 获取可切换列表:查询
user_relations表,以当前original_user_id为parent_user_id,关联users表获取所有下属子用户的基础信息(如用户名、ID)。 - 切换账号:
- 校验目标子用户与当前主用户是否存在从属关系(通过
user_relations表查询); - 若开启日志功能,向
user_session_switches插入切换记录; - 更新会话中的
current_user_id为目标子用户ID,后续业务接口均基于current_user_id返回对应数据。
- 校验目标子用户与当前主用户是否存在从属关系(通过
- 切换回主账号:直接将会话中的
current_user_id重置为original_user_id即可。
扩展优化建议
- 精细化权限:若需控制主用户对不同子用户的操作权限,可在
user_relations表中新增permissions字段(JSON类型),存储该主用户可操作此子用户的功能模块(如{"view_dashboard": true, "edit_data": false})。 - 多级从属支持:如果业务需要多级管理(如管理员→经理→主管→员工),可通过递归查询
user_relations表获取主用户的所有下属,或新增level字段标记从属层级。 - 数据隔离:所有业务数据表(如订单、报表)需新增
user_id字段,查询时根据会话中的current_user_id或主用户关联的子用户ID集合过滤数据,确保数据访问隔离。
内容的提问来源于stack exchange,提问作者brokefacebaby
相关产品推荐
相关产品推荐

