# 智能办公管理系统 - 数据库设计文档 ## 数据库架构概述 系统采用多数据库设计,根据业务特点选择最适合的数据库类型: - **PostgreSQL**: 核心业务数据(用户、角色、权限、考勤、审批等) - **MongoDB**: 文档协作、聊天记录、文件元数据等非结构化数据 - **Redis**: 缓存、会话、分布式锁、消息队列 - **Elasticsearch**: 日志、搜索、分析 ## PostgreSQL数据库设计 ### 1. 认证授权模块 (auth_service) #### 1.1 用户表 (sys_user) ```sql CREATE TABLE sys_user ( id BIGSERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(200) NOT NULL, email VARCHAR(100), phone VARCHAR(20), nickname VARCHAR(50), real_name VARCHAR(50), avatar VARCHAR(500), gender INTEGER DEFAULT 0, birthday TIMESTAMP, dept_id BIGINT, position VARCHAR(100), status INTEGER DEFAULT 1, last_login_time TIMESTAMP, last_login_ip VARCHAR(50), login_count INTEGER DEFAULT 0, failed_login_count INTEGER DEFAULT 0, lock_time TIMESTAMP, password_reset_time TIMESTAMP, is_super_admin BOOLEAN DEFAULT FALSE, remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by BIGINT, update_by BIGINT, deleted BOOLEAN DEFAULT FALSE ); CREATE INDEX idx_username ON sys_user(username); CREATE INDEX idx_email ON sys_user(email); CREATE INDEX idx_phone ON sys_user(phone); CREATE INDEX idx_dept_id ON sys_user(dept_id); ``` #### 1.2 角色表 (sys_role) ```sql CREATE TABLE sys_role ( id BIGSERIAL PRIMARY KEY, role_code VARCHAR(50) NOT NULL UNIQUE, role_name VARCHAR(50) NOT NULL, description VARCHAR(200), data_scope INTEGER DEFAULT 1, status INTEGER DEFAULT 1, sort INTEGER DEFAULT 0, is_system BOOLEAN DEFAULT FALSE, remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by BIGINT, update_by BIGINT, deleted BOOLEAN DEFAULT FALSE ); CREATE INDEX idx_role_code ON sys_role(role_code); CREATE INDEX idx_role_name ON sys_role(role_name); ``` #### 1.3 权限表 (sys_permission) ```sql CREATE TABLE sys_permission ( id BIGSERIAL PRIMARY KEY, permission_code VARCHAR(100) NOT NULL UNIQUE, permission_name VARCHAR(50) NOT NULL, permission_type INTEGER NOT NULL, parent_id BIGINT DEFAULT 0, path VARCHAR(200), component VARCHAR(200), icon VARCHAR(100), sort INTEGER DEFAULT 0, status INTEGER DEFAULT 1, is_visible BOOLEAN DEFAULT TRUE, is_cache BOOLEAN DEFAULT FALSE, is_external BOOLEAN DEFAULT FALSE, external_url VARCHAR(500), request_method VARCHAR(20), api_path VARCHAR(500), remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by BIGINT, update_by BIGINT, deleted BOOLEAN DEFAULT FALSE ); CREATE INDEX idx_permission_code ON sys_permission(permission_code); CREATE INDEX idx_parent_id ON sys_permission(parent_id); CREATE INDEX idx_sort ON sys_permission(sort); ``` #### 1.4 关联表 ```sql -- 用户角色关联表 CREATE TABLE sys_user_role ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, role_id BIGINT NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(user_id, role_id) ); -- 角色权限关联表 CREATE TABLE sys_role_permission ( id BIGSERIAL PRIMARY KEY, role_id BIGINT NOT NULL, permission_id BIGINT NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(role_id, permission_id) ); ``` ### 2. 考勤管理模块 (attendance_service) #### 2.1 考勤记录表 (attendance_record) ```sql CREATE TABLE attendance_record ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, dept_id BIGINT, attendance_date DATE NOT NULL, check_in_time TIMESTAMP, check_out_time TIMESTAMP, work_hours DECIMAL(5,2), late_minutes INTEGER DEFAULT 0, early_minutes INTEGER DEFAULT 0, overtime_hours DECIMAL(5,2) DEFAULT 0, attendance_status INTEGER DEFAULT 0, -- 0:正常, 1:迟到, 2:早退, 3:缺勤, 4:请假, 5:加班 location VARCHAR(200), latitude DECIMAL(10,8), longitude DECIMAL(11,8), device_info VARCHAR(200), ip_address VARCHAR(50), remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_user_date ON attendance_record(user_id, attendance_date); CREATE INDEX idx_dept_date ON attendance_record(dept_id, attendance_date); ``` #### 2.2 请假申请表 (leave_request) ```sql CREATE TABLE leave_request ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, leave_type INTEGER NOT NULL, -- 1:年假, 2:病假, 3:事假, 4:婚假, 5:产假, 6:丧假 start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, duration_days DECIMAL(5,2), reason VARCHAR(500), attachment_url VARCHAR(500), status INTEGER DEFAULT 0, -- 0:待审批, 1:已通过, 2:已拒绝, 3:已取消 approval_flow_id BIGINT, current_approver_id BIGINT, remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_user_status ON leave_request(user_id, status); CREATE INDEX idx_approval_flow ON leave_request(approval_flow_id); ``` #### 2.3 加班申请表 (overtime_request) ```sql CREATE TABLE overtime_request ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, overtime_date DATE NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, duration_hours DECIMAL(5,2), reason VARCHAR(500), compensation_type INTEGER DEFAULT 1, -- 1:调休, 2:加班费 status INTEGER DEFAULT 0, approval_flow_id BIGINT, current_approver_id BIGINT, remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### 3. 审批流程模块 (approval_service) #### 3.1 工作流定义表 (workflow_definition) ```sql CREATE TABLE workflow_definition ( id BIGSERIAL PRIMARY KEY, workflow_code VARCHAR(50) NOT NULL UNIQUE, workflow_name VARCHAR(100) NOT NULL, workflow_type INTEGER NOT NULL, -- 1:请假, 2:加班, 3:报销, 4:采购, 5:通用 description VARCHAR(500), version INTEGER DEFAULT 1, status INTEGER DEFAULT 1, form_schema JSONB, process_definition JSONB, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by BIGINT, update_by BIGINT ); ``` #### 3.2 工作流实例表 (workflow_instance) ```sql CREATE TABLE workflow_instance ( id BIGSERIAL PRIMARY KEY, workflow_definition_id BIGINT NOT NULL, business_key VARCHAR(100), business_type VARCHAR(50), business_data JSONB, initiator_id BIGINT NOT NULL, current_node_id BIGINT, current_assignee_id BIGINT, status INTEGER DEFAULT 0, -- 0:进行中, 1:已完成, 2:已终止, 3:已取消 start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, end_time TIMESTAMP, duration_days INTEGER, remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_business_key ON workflow_instance(business_key); CREATE INDEX idx_initiator_status ON workflow_instance(initiator_id, status); ``` #### 3.3 审批节点表 (approval_node) ```sql CREATE TABLE approval_node ( id BIGSERIAL PRIMARY KEY, workflow_instance_id BIGINT NOT NULL, node_code VARCHAR(50) NOT NULL, node_name VARCHAR(100) NOT NULL, node_type INTEGER NOT NULL, -- 1:开始, 2:审批, 3:会签, 4:或签, 5:结束 assignee_type INTEGER NOT NULL, -- 1:指定人, 2:角色, 3:部门负责人, 4:发起人自选 assignee_ids JSONB, status INTEGER DEFAULT 0, -- 0:待处理, 1:已通过, 2:已拒绝, 3:已跳过 start_time TIMESTAMP, end_time TIMESTAMP, duration_hours DECIMAL(5,2), comment VARCHAR(500), attachment_url VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### 4. 文档协作模块 (document_service) #### 4.1 文档表 (document) - MongoDB集合 ```json { "_id": ObjectId, "document_id": String, "title": String, "content": String, "content_type": String, // "text", "markdown", "html" "owner_id": Number, "owner_name": String, "space_id": String, "parent_id": String, "tags": [String], "permissions": { "view": [Number], // 用户ID列表 "edit": [Number], "comment": [Number], "share": [Number] }, "version": Number, "current_version_id": String, "is_published": Boolean, "published_version": Number, "status": String, // "draft", "published", "archived" "metadata": { "word_count": Number, "page_count": Number, "language": String, "created_from": String // "web", "mobile", "import" }, "statistics": { "view_count": Number, "edit_count": Number, "comment_count": Number, "share_count": Number }, "created_at": Date, "updated_at": Date, "deleted_at": Date } ``` #### 4.2 文档版本表 (document_version) - MongoDB集合 ```json { "_id": ObjectId, "version_id": String, "document_id": String, "version_number": Number, "title": String, "content": String, "content_hash": String, "change_summary": String, "author_id": Number, "author_name": String, "created_at": Date, "metadata": { "operation": String, // "create", "edit", "restore" "client_info": String, "ip_address": String } } ``` ### 5. 即时通讯模块 (chat_service) #### 5.1 聊天室表 (chat_room) - MongoDB集合 ```json { "_id": ObjectId, "room_id": String, "room_name": String, "room_type": String, // "private", "group", "channel" "avatar": String, "description": String, "owner_id": Number, "admin_ids": [Number], "member_ids": [Number], "settings": { "mute_all": Boolean, "allow_invite": Boolean, "need_approval": Boolean, "max_members": Number }, "last_message": { "message_id": String, "content": String, "sender_id": Number, "sender_name": String, "timestamp": Date }, "unread_count": Map, // userId -> count "created_at": Date, "updated_at": Date } ``` #### 5.2 消息表 (message) - MongoDB集合 ```json { "_id": ObjectId, "message_id": String, "room_id": String, "sender_id": Number, "sender_name": String, "sender_avatar": String, "content_type": String, // "text", "image", "file", "voice", "video" "content": String, "metadata": { "file_url": String, "file_name": String, "file_size": Number, "duration": Number, "width": Number, "height": Number }, "reply_to": String, // 回复的消息ID "mentions": [Number], // 被@的用户ID "reactions": Map, // emoji -> [userId] "read_by": [Number], // 已读用户ID "deleted_for": [Number], // 对哪些用户不可见 "is_system": Boolean, "is_edited": Boolean, "edited_at": Date, "is_recalled": Boolean, "recalled_at": Date, "created_at": Date, "updated_at": Date } ``` ### 6. 系统管理模块 #### 6.1 部门表 (sys_department) ```sql CREATE TABLE sys_department ( id BIGSERIAL PRIMARY KEY, dept_code VARCHAR(50) NOT NULL UNIQUE, dept_name VARCHAR(100) NOT NULL, parent_id BIGINT DEFAULT 0, ancestors VARCHAR(500), leader_id BIGINT, sort INTEGER DEFAULT 0, status INTEGER DEFAULT 1, phone VARCHAR(20), email VARCHAR(100), address VARCHAR(200), remark VARCHAR(500), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by BIGINT, update_by BIGINT, deleted BOOLEAN DEFAULT FALSE ); CREATE INDEX idx_dept_code ON sys_department(dept_code); CREATE INDEX idx_parent_id ON sys_department(parent_id); ``` #### 6.2 操作日志表 (sys_operation_log) ```sql CREATE TABLE sys_operation_log ( id BIGSERIAL PRIMARY KEY, user_id BIGINT, username VARCHAR(50), real_name VARCHAR(50), operation_type VARCHAR(50), operation_module VARCHAR(100), operation_description VARCHAR(500), request_method VARCHAR(10), request_url VARCHAR(500), request_params TEXT, request_ip VARCHAR(50), request_location VARCHAR(100), user_agent VARCHAR(500), execute_time BIGINT, status INTEGER DEFAULT 1, error_message TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_user_time ON sys_operation_log(user_id, create_time); CREATE INDEX idx_module_time ON sys_operation_log(operation_module, create_time); ``` ## 数据库优化策略 ### 1. 索引优化 - 为所有外键字段创建索引 - 为频繁查询的组合字段创建复合索引 - 为时间范围查询字段创建索引 ### 2. 分区策略 - 按时间分区:操作日志、考勤记录等时间序列数据 - 按业务分区:不同租户的数据分离 ### 3. 读写分离 - 主库:写操作和实时读操作 - 从库:报表查询、数据分析等非实时读操作 ### 4. 缓存策略 - Redis缓存热点数据:用户信息、权限信息、配置信息 - 缓存查询结果:复杂查询结果缓存5-30分钟 - 分布式会话:用户会话信息存储在Redis中 ### 5. 数据归档 - 历史数据归档到冷存储 - 定期清理过期数据 - 数据备份和恢复策略 ## 数据库初始化脚本 系统启动时会自动执行以下初始化: 1. 创建数据库和用户 2. 创建表结构和索引 3. 插入基础数据(系统角色、权限、管理员用户) 4. 创建数据库函数和触发器 ## 数据迁移策略 1. 使用Flyway进行数据库版本管理 2. 支持回滚操作 3. 数据迁移前备份 4. 灰度发布,逐步迁移 ## 监控和告警 1. 数据库连接池监控 2. 慢查询监控和优化 3. 死锁检测和解决 4. 空间使用监控 5. 备份状态监控 --- *文档版本: v1.0* *最后更新: 2026-01-27* *作者: 数据库设计团队*