Files
pj0235-eai_agentplatform/docs/db_schema.md
T
eaiadmin 4e8817d768 init: 数字员工平台初始代码
包含前端(Vue3 + VueFlow 画布)、后端(Go)、文档体系。
- 工作台画布:节点拖放、连线模式、右键菜单、AI 助手
- 后端:连接器 API、专员种子数据
- 导航:左侧导航、工坊、市场、控制台
2026-08-18 20:19:58 +08:00

16 KiB
Raw Blame History

eaisalestrain_app — 数据库 Schema

版本:V1.2 | 引擎:MySQL 8.0(关系数据)+ FAISS(向量检索)| ORM:GORM 最后更新:2026-08-16


约定

数据库使用 MySQL 8.0(GORM AutoMigrate 建表),AI 知识检索采用 MySQL 全文索引(关键词)+ FAISS 向量检索(语义)双路混合召回。 下列 DDL 为权威字段定义;ENUM、FULLTEXT ngram、ON DELETE 外键级联为 MySQL 原生能力。 V1.4–V1.7 新增表(岗位/积分/证书/部门/消息等)见文末「新增表清单」。

  • 主键 id 为 BIGINT UNSIGNED AUTO_INCREMENT
  • 时间字段 created_at / updated_at 为 DATETIME,默认 CURRENT_TIMESTAMP
  • 外键命名规则:fk_{本表}_{关联表}_{字段}
  • 索引命名规则:idx_{表}_{字段}

1. user — 用户表

CREATE TABLE user (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username        VARCHAR(64)  NOT NULL UNIQUE COMMENT '登录用户名',
    password_hash   VARCHAR(256) NOT NULL        COMMENT 'bcrypt 哈希',
    full_name       VARCHAR(64)  NOT NULL        COMMENT '显示姓名',
    role            ENUM('employee','admin') NOT NULL DEFAULT 'employee',
    status          ENUM('active','disabled') NOT NULL DEFAULT 'active',
    created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_user_role (role),
    INDEX idx_user_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

说明:

  • role=admin 为管理员,role=employee 为普通员工
  • status=disabled 时 token 校验拒绝访问
  • 仅管理员可创建 / 禁用账号

2. product — 产品表

CREATE TABLE product (
    id                    BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code                  VARCHAR(32)  NOT NULL UNIQUE COMMENT '产品编号',
    name                  VARCHAR(128) NOT NULL        COMMENT '产品名称',
    category              ENUM('capital_consulting','qualification_counseling',
                               'ai_consulting','ai_tools_platform') NOT NULL
                                                      COMMENT '四大分类',
    tags                  VARCHAR(256) DEFAULT ''     COMMENT '标签,逗号分隔',
    description           TEXT                         COMMENT '业务内容说明',
    pricing               TEXT                         COMMENT '收费结构',
    commission_recommend  VARCHAR(128) DEFAULT ''     COMMENT '推荐佣金比例',
    commission_negotiate  VARCHAR(128) DEFAULT ''     COMMENT '谈单参与佣金比例',
    public_course_bonus   VARCHAR(128) DEFAULT ''     COMMENT '公开课超额分成',
    version_risk          TEXT                         COMMENT '版本风险',
    report_rules          TEXT                         COMMENT '报备规则备注',
    status                ENUM('active','inactive') NOT NULL DEFAULT 'active',
    created_at            DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at            DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_product_category (category),
    INDEX idx_product_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. course — 课程表

CREATE TABLE course (
    id                    BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code                  VARCHAR(32)  NOT NULL UNIQUE COMMENT '课程编号',
    name                  VARCHAR(128) NOT NULL        COMMENT '课程名称',
    category              ENUM('capital_script','qualification_logic',
                               'ai_public_course','ai_platform_matching') NOT NULL
                                                      COMMENT '四大课程分类',
    target_customers      TEXT                         COMMENT '适配客户',
    forbidden_customers   TEXT                         COMMENT '禁接客户',
    scripts               TEXT                         COMMENT '标准话术',
    sales_process         TEXT                         COMMENT '谈单流程',
    objection_handling    TEXT                         COMMENT '异议处理',
    delivery_pitfalls     TEXT                         COMMENT '交付避坑',
    report_rules          TEXT                         COMMENT '报备规范',
    related_product_id    BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定产品ID',
    status                ENUM('active','inactive') NOT NULL DEFAULT 'active',
    created_at            DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at            DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_course_category (category),
    INDEX idx_course_status (status),
    INDEX idx_course_product (related_product_id),
    CONSTRAINT fk_course_product FOREIGN KEY (related_product_id) REFERENCES product(id)
        ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4. media_file — 素材文件表

CREATE TABLE media_file (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    filename        VARCHAR(256) NOT NULL        COMMENT '原始文件名',
    stored_name     VARCHAR(64)  NOT NULL        COMMENT '存储UUID文件名',
    stored_path     VARCHAR(512) NOT NULL        COMMENT '存储相对路径',
    file_ext        VARCHAR(16)  NOT NULL        COMMENT '扩展名(小写无点)',
    file_size       BIGINT UNSIGNED NOT NULL     COMMENT '文件大小(字节)',
    status          ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
    source          ENUM('employee','admin') NOT NULL COMMENT '上传来源',
    submitter_id    BIGINT UNSIGNED NOT NULL     COMMENT '提交人ID',
    remark          VARCHAR(512) DEFAULT NULL    COMMENT '提交备注(员工素材建议)',
    bind_type       ENUM('company','product','course','none') NOT NULL DEFAULT 'none'
                                                 COMMENT '绑定类型',
    bind_id         BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定实体ID',
    reject_reason   VARCHAR(512) DEFAULT NULL    COMMENT '驳回理由',
    audit_by        BIGINT UNSIGNED DEFAULT NULL COMMENT '审批人ID',
    audit_at        DATETIME(6) DEFAULT NULL     COMMENT '审批时间',
    extracted       TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已提取文本',
    created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),

    INDEX idx_media_status (status),
    INDEX idx_media_submitter (submitter_id),
    INDEX idx_media_bind (bind_type, bind_id),
    INDEX idx_media_extracted (extracted),
    CONSTRAINT fk_media_submitter FOREIGN KEY (submitter_id) REFERENCES user(id),
    CONSTRAINT fk_media_auditor  FOREIGN KEY (audit_by)     REFERENCES user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

5. knowledge_chunk — 知识块表

CREATE TABLE knowledge_chunk (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    media_file_id       BIGINT UNSIGNED DEFAULT NULL COMMENT '关联素材ID(与 knowledge_source_id 二选一)',
    knowledge_source_id BIGINT UNSIGNED DEFAULT NULL COMMENT '关联知识源ID(与 media_file_id 二选一)',
    source_type         VARCHAR(32) NOT NULL         COMMENT '来源类型(pdf/doc/md)',
    source_id           VARCHAR(64) DEFAULT NULL     COMMENT '来源标识',
    chunk_index         INT UNSIGNED NOT NULL        COMMENT '段落序号',
    content             TEXT NOT NULL                COMMENT '文本内容',
    created_at          DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),

    INDEX idx_kc_media (media_file_id),
    INDEX idx_kc_source (knowledge_source_id),
    FULLTEXT INDEX ft_kc_content (content) WITH PARSER ngram COMMENT 'MySQL全文索引(ngram 中文分词)用于AI检索',
    CONSTRAINT fk_kc_media FOREIGN KEY (media_file_id) REFERENCES media_file(id)
        ON DELETE CASCADE,
    CONSTRAINT fk_kc_source FOREIGN KEY (knowledge_source_id) REFERENCES knowledge_source(id)
        ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

> 约束说明:`media_file_id` 与 `knowledge_source_id` 二者必居其一(应用层校验,Fail Fast)。

6. question — 题目表

CREATE TABLE question (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    domain          ENUM('company','product','sales') NOT NULL
                                                 COMMENT '所属知识域',
    course_id       BIGINT UNSIGNED DEFAULT NULL COMMENT '绑定课程(sales域时可选)',
    type            ENUM('single','multiple','judge') NOT NULL
                                                 COMMENT '题型',
    stem            TEXT NOT NULL                COMMENT '题干',
    options         JSON NOT NULL                COMMENT '选项JSON',
    answer          JSON NOT NULL                COMMENT '正确答案JSON',
    explanation     TEXT DEFAULT ''              COMMENT '答案解析',
    status          ENUM('active','inactive') NOT NULL DEFAULT 'active',
    created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_question_domain (domain),
    INDEX idx_question_course (course_id),
    INDEX idx_question_status (status),
    CONSTRAINT fk_question_course FOREIGN KEY (course_id) REFERENCES course(id)
        ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

7. exam_paper — 考试配置表

CREATE TABLE exam_paper (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name            VARCHAR(128) NOT NULL        COMMENT '考试名称',
    type            ENUM('self_test','formal') NOT NULL
                                                 COMMENT '考试类型',
    domain          VARCHAR(64) NOT NULL         COMMENT '抽题知识域(逗号分隔)',
    question_count  INT UNSIGNED NOT NULL        COMMENT '题量',
    total_score     INT UNSIGNED NOT NULL        COMMENT '总分',
    pass_score      INT UNSIGNED NOT NULL        COMMENT '合格线',
    duration_minutes INT UNSIGNED NOT NULL       COMMENT '考试时长(分钟)',
    randomize       TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否随机抽题',
    status          ENUM('active','inactive') NOT NULL DEFAULT 'active',
    created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_paper_type (type),
    INDEX idx_paper_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

8. exam_record — 考试记录表

CREATE TABLE exam_record (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id         BIGINT UNSIGNED NOT NULL     COMMENT '考生ID',
    paper_id        BIGINT UNSIGNED NOT NULL     COMMENT '考试配置ID',
    exam_name       VARCHAR(128) NOT NULL        COMMENT '考试名称(冗余)',
    score           INT UNSIGNED NOT NULL        COMMENT '得分',
    total_score     INT UNSIGNED NOT NULL        COMMENT '总分(冗余)',
    pass_score      INT UNSIGNED NOT NULL        COMMENT '合格线(冗余)',
    passed          TINYINT(1) NOT NULL          COMMENT '是否通过',
    correct_count   INT UNSIGNED NOT NULL        COMMENT '答对数',
    wrong_count     INT UNSIGNED NOT NULL        COMMENT '答错数',
    detail_json     JSON NOT NULL                COMMENT '答题明细JSON',
    submitted_at    DATETIME(6) NOT NULL         COMMENT '交卷时间',

    INDEX idx_record_user (user_id),
    INDEX idx_record_paper (paper_id),
    INDEX idx_record_passed (passed),
    INDEX idx_record_submitted (submitted_at),
    CONSTRAINT fk_record_user  FOREIGN KEY (user_id)  REFERENCES user(id)
        ON DELETE CASCADE,
    CONSTRAINT fk_record_paper FOREIGN KEY (paper_id) REFERENCES exam_paper(id)
        ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

9. system_config — 系统参数配置表

CREATE TABLE system_config (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    config_key      VARCHAR(64) NOT NULL UNIQUE  COMMENT '配置键',
    config_value    TEXT NOT NULL                COMMENT '配置值',
    description     VARCHAR(256) DEFAULT ''      COMMENT '配置说明',
    updated_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_config_key (config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

默认配置项

config_key 默认值 说明
llm_base_url http://localhost:11434/v1 LLM 服务地址
llm_api_key sk-xxx LLM API Key
llm_model qwen2.5:7b LLM 模型名
jwt_expire_minutes 480 Token 过期分钟数
file_max_size_doc 209715200 文档最大字节(200MB)
file_max_size_video 2147483648 视频最大字节(2GB)
chunk_threshold 104857600 分片上传阈值(100MB)

10. knowledge_source — 结构化知识源表

承载 docs/knowledge_source/*.md 的审批与摄入状态。完整设计见 04_Backend/BE05_Knowledge_Ingest_Module.md。

CREATE TABLE knowledge_source (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title           VARCHAR(256) NOT NULL        COMMENT '文档标题',
    file_path       VARCHAR(512) NOT NULL UNIQUE COMMENT 'md 相对路径(docs/knowledge_source/ 下)',
    category        VARCHAR(64)  NOT NULL        COMMENT '分类:general/capital_consulting/qualification_counseling/ai_consulting/ai_tools_platform',
    domain          ENUM('company','product','sales') NOT NULL DEFAULT 'product',
    source_version  VARCHAR(32)  NOT NULL        COMMENT '源版本,如 V1.0',
    audit_status    ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
    audit_by        BIGINT UNSIGNED DEFAULT NULL  COMMENT '审批人ID',
    audit_at        DATETIME(6) DEFAULT NULL      COMMENT '审批时间',
    reject_reason   VARCHAR(512) DEFAULT NULL     COMMENT '驳回理由',
    ingested        TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已摄入',
    created_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    updated_at      DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

    INDEX idx_ks_status (audit_status),
    INDEX idx_ks_category (category),
    CONSTRAINT fk_ks_auditor FOREIGN KEY (audit_by) REFERENCES user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

附:ER 关系

user ──< media_file          (submitter_id / audit_by)
user ──< exam_record         (user_id)
user ──< question            (course_id → course)
user ──< knowledge_source    (audit_by)
product ──< course           (related_product_id)
course ──< question          (course_id, optional)
media_file ──< knowledge_chunk (media_file_id)
knowledge_source ──< knowledge_chunk (knowledge_source_id)
exam_paper ──< exam_record   (paper_id)

附:V1.4–V1.7 新增表清单

下表未在本文件给出完整 DDL,字段与建表细节以 docs/changelog.md 对应版本及 Go 后端 GORM 模型为准。

版本 表名 用途
V1.4 position 岗位字典
V1.4 position_knowledge 岗位 → 知识映射(域/课程/产品 + 级别 L1-L4 + 权重 + 必学)
V1.5 position_exam_blueprint 岗位考试蓝图(按域+题型+题量抽题)
V1.5 mistake_record 错题本(按 user+question 去重,标记已掌握)
V1.6 point_event 学习积分流水(可审计)
V1.6 certificate 考试合格证书(按 exam_record 幂等去重)
V1.7 department 部门字典(部门改名同步 user.department)
V1.7 notification 站内消息通知(事件钩子驱动)

列级变更: user.learning_points(V1.6)、user.position_id(V1.4)、user.department(V1.7)、exam_paper.position_id(V1.4)、question.type 增加 essay(V1.5)。