
flat-server数据库设计用户、房间与云存储表结构深度解析【免费下载链接】flat-serverA Node.js server for the Agora Flat open source classroom.项目地址: https://gitcode.com/gh_mirrors/fl/flat-serverflat-server作为Agora Flat开源教室的核心后端服务其数据库设计直接影响系统的稳定性与扩展性。本文将深度解析用户管理、房间控制和云存储三大核心模块的表结构设计揭示如何通过合理的表结构实现百万级用户的在线教学场景支持。用户管理模块身份体系的基石用户模块采用主表关联表的设计模式通过users主表存储核心身份信息配合第三方登录关联表实现多平台账号统一管理。用户核心表usersusers表作为用户体系的核心存储了最关键的身份标识与基础信息Entity({ name: users }) export class UserModel extends Content { Index(users_user_uuid_uindex, { unique: true }) Column({ length: 40 }) user_uuid: string; // 用户唯一标识 Column({ length: 50 }) user_name: string; // 用户名 Column({ precision: 32 }) user_password: string; // 密码哈希 Column({ length: 2083 }) avatar_url: string; // 头像URL Column({ type: enum, enum: [Gender.Man, Gender.Woman, Gender.None], default: Gender.None }) gender: Gender; // 性别 Index(users_is_blacklist_index) Column({ default: false }) is_blacklist: boolean; // 是否黑名单用户 }核心设计亮点使用user_uuid作为业务主键避免自增ID暴露用户数量通过is_blacklist字段实现基础封禁功能配合user_blacklist表实现完整封禁体系索引设计兼顾查询效率与唯一性约束如users_user_uuid_uindex确保用户UUID不重复用户黑名单表user_blacklist该表存储详细的用户封禁记录支持多维度封禁策略CREATE TABLE user_blacklist ( id BIGINT NOT NULL AUTO_INCREMENT, user_uuid VARCHAR(40) NULL DEFAULT NULL COMMENT 被封禁用户UUID, phone_number VARCHAR(50) NULL DEFAULT NULL COMMENT 被封禁手机号, email VARCHAR(100) NULL DEFAULT NULL COMMENT 被封禁邮箱, reason VARCHAR(255) NULL DEFAULT NULL COMMENT 封禁原因, operator VARCHAR(40) NULL DEFAULT NULL COMMENT 操作人, is_delete TINYINT(1) NOT NULL DEFAULT 0, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), INDEX user_blacklist_user_uuid_index (user_uuid), UNIQUE INDEX user_blacklist_phone_uindex (phone_number), UNIQUE INDEX user_blacklist_email_uindex (email) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户黑名单;设计特点支持通过UUID、手机号、邮箱三种方式封禁用户手机号和邮箱设置唯一索引防止重复封禁保留操作人信息满足审计需求第三方登录关联表系统支持多种登录方式每种方式对应独立的关联表如Agora登录关联表微信登录关联表GitHub登录关联表以微信登录关联表为例Entity({ name: user_wechat }) export class UserWeChatModel extends Content { Index(user_wechat_open_id_uindex, { unique: true }) Column({ length: 64 }) open_id: string; // 微信开放平台ID Column({ length: 40 }) user_uuid: string; // 关联的用户UUID }这种设计既保证了数据隔离又通过user_uuid实现了多账号的统一关联。房间管理模块在线教学的核心载体房间模块采用主房间周期性房间房间用户的三级结构灵活支持单次课程与系列课程两种教学模式。房间主表roomsrooms表存储单次课程的核心信息Entity({ name: rooms }) export class RoomModel extends Content { Index(rooms_room_uuid_uindex, { unique: true }) Column({ length: 40 }) room_uuid: string; // 房间唯一标识 Index(rooms_periodic_uuid_index) Column({ length: 40 }) periodic_uuid: string; // 周期性房间UUID如为系列课程 Index(rooms_owner_uuid_index) Column({ length: 40 }) owner_uuid: string; // 房间创建者UUID Column({ length: 150 }) title: string; // 房间标题 Index(rooms_room_type_index) Column({ type: enum, enum: [RoomType.OneToOne, RoomType.BigClass, RoomType.SmallClass] }) room_type: RoomType; // 房间类型一对一/大班课/小班课 Index(rooms_room_status_index) Column({ type: enum, enum: [RoomStatus.Idle, RoomStatus.Started, RoomStatus.Paused, RoomStatus.Stopped] }) room_status: RoomStatus; // 房间状态 Index(rooms_begin_time_index) Column({ type: datetime, precision: 3 }) begin_time: Date; // 开始时间 Column({ type: datetime, precision: 3 }) end_time: Date; // 结束时间 Column({ type: enum, enum: [Region.CN_HZ, Region.US_SV, Region.SG, Region.IN_MUM, Region.GB_LON] }) region: Region; // 服务器区域 Index(rooms_whiteboard_room_uuid_uindex, { unique: true }) Column({ length: 40 }) whiteboard_room_uuid: string; // 白板房间UUID }关键设计考量支持多区域部署通过region字段实现就近接入房间状态流转清晰支持Idle→Started→Paused→Stopped完整生命周期与白板服务深度集成通过whiteboard_room_uuid建立关联周期性房间表room_periodic针对系列课程场景设计了room_periodic表存储周期性课程信息Entity({ name: room_periodic }) export class RoomPeriodicModel extends Content { Index(room_periodic_periodic_uuid_uindex, { unique: true }) Column({ length: 40 }) periodic_uuid: string; // 周期性房间唯一标识 Column({ length: 40 }) owner_uuid: string; // 创建者UUID Column({ length: 150 }) title: string; // 课程标题 Column({ type: json }) config: PeriodicConfig; // 周期性配置频率、周几等 }配合RoomPeriodicConfig表和RoomPeriodicUser表实现周期性课程的完整管理。房间用户关联表room_user该表记录用户与房间的关联关系支持角色权限控制Entity({ name: room_user }) export class RoomUserModel extends Content { Index(room_user_room_uuid_index) Column({ length: 40 }) room_uuid: string; // 房间UUID Index(room_user_user_uuid_index) Column({ length: 40 }) user_uuid: string; // 用户UUID Column({ type: enum, enum: [RoomUserRole.Owner, RoomUserRole.Admin, RoomUserRole.User] }) role: RoomUserRole; // 用户角色 Column({ default: false }) is_camera_on: boolean; // 摄像头状态 Column({ default: false }) is_microphone_on: boolean; // 麦克风状态 }通过复合索引room_user_room_uuid_user_uuid_index确保用户在房间中的唯一性。云存储模块教学资源的管理中心云存储模块采用文件元数据用户文件关联的设计模式支持多类型教学资源的存储与访问控制。文件元数据表cloud_storage_filescloud_storage_files表存储文件的核心元数据Entity({ name: cloud_storage_files }) export class CloudStorageFilesModel extends Content { Index(cloud_storage_files_file_uuid_uindex, { unique: true }) Column({ length: 40 }) file_uuid: string; // 文件唯一标识 Column({ length: 128 }) file_name: string; // 文件名 Column({ unsigned: true, type: int }) file_size: number; // 文件大小字节 Column({ length: 256 }) file_url: string; // 文件访问URL Column({ length: 300, default: / }) directory_path: string; // 目录路径 Column({ type: json, default: () ({}) }) payload: FilePayload; // 文件额外信息如转换状态、缩略图等 Index(cloud_storage_files_resource_type_index) Column({ length: 20, type: varchar }) resource_type: FileResourceType; // 文件类型 }设计亮点通过resource_type字段区分不同类型文件如文档、视频、图片等payload字段使用JSON类型存储动态元数据适应不同文件类型需求支持目录结构通过directory_path实现文件组织用户文件关联表cloud_storage_user_files该表管理用户与文件的所有权关系Entity({ name: cloud_storage_user_files }) export class CloudStorageUserFilesModel extends Content { Index(cloud_storage_user_files_user_uuid_index) Column({ length: 40 }) user_uuid: string; // 用户UUID Index(cloud_storage_user_files_file_uuid_index) Column({ length: 40 }) file_uuid: string; // 文件UUID Index(cloud_storage_user_files_user_file_uindex, { unique: true }) Column({ length: 40 }) user_file_uuid: string; // 用户文件唯一标识 }通过user_file_uuid实现用户对同一文件的多次引用节省存储空间。表结构设计最佳实践总结flat-server的数据库设计遵循以下原则确保系统高效稳定运行业务主键设计采用UUID作为业务主键避免自增ID带来的安全风险与分库分表困难索引优化为所有查询条件和关联字段建立合适索引如rooms_owner_uuid_index加速房间列表查询软删除机制通过is_delete字段实现逻辑删除保留历史数据便于审计与恢复多表关联通过UUID建立表间关联而非直接外键约束提高系统灵活性时间精度所有时间字段采用DATETIME(3)类型提供毫秒级时间精度扩展字段使用JSON类型字段如payload存储动态变化的元数据这些设计决策使flat-server能够支持从几十人到上万人的在线教学场景为Agora Flat开源教室提供坚实的数据基础。数据库迁移与维护项目提供完善的数据库迁移脚本位于scripts/migration/目录下每个迁移脚本都包含详细的变更说明和回滚方案。例如用户黑名单迁移脚本管理员账号迁移脚本建议定期执行yarn run sync-orm命令同步实体模型与数据库结构确保开发与生产环境的表结构一致。通过这套精心设计的数据库架构flat-server实现了用户、房间、资源的高效管理为在线教育场景提供了可靠的数据支撑。开发者可以基于这些表结构快速扩展新功能或进行性能优化。【免费下载链接】flat-serverA Node.js server for the Agora Flat open source classroom.项目地址: https://gitcode.com/gh_mirrors/fl/flat-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考