-- 本文件由 scripts/gen_ddl_from_models.py 自动生成,**单一真源 = models/*.json**。 -- 禁止手工编辑本文件(改表结构请改 models/{table}.json 后重跑本脚本)。 -- 生成命令:python3 scripts/gen_ddl_from_models.py -- -- M5a-DISC.1 主键口径(models / DDL / collector 三方对齐): -- id = VARCHAR(32) NOT NULL,无 AUTO_INCREMENT、无 DEFAULT; -- 主键值由应用层 pbl_evidence/pk.py:gen_pk()(appPublic.uniqueID.getID, -- 离线降级 uuid4().hex,长度均 <= 32)在 INSERT 前生成并显式写入列集合。 -- 引用字段 tenant_id/artifact_id/session_id/blueprint_id/learner_id/ -- source_event_id/dedup_key/collect_batch_id 一律 VARCHAR(32),与主键同型, -- JOIN / 等值比较不存在类型不匹配。 -- 表 pbl_artifact(真源 models/pbl_artifact.json) CREATE TABLE IF NOT EXISTS `pbl_artifact` ( `id` VARCHAR(32) NOT NULL COMMENT '主键', `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '租户ID(强制打头)', `artifact_uid` VARCHAR(32) NOT NULL COMMENT '产出UID', `session_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '会话ID', `blueprint_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '蓝图ID', `team_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '团队ID', `creator_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '作者', `title` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '标题', `artifact_type` VARCHAR(64) NOT NULL DEFAULT 'other' COMMENT '产出物类型', `content_json` LONGTEXT NULL COMMENT '内容(序列化JSON文本)', `version_no` INT NOT NULL DEFAULT 1 COMMENT '版本号(内联)', `status` VARCHAR(64) NOT NULL DEFAULT 'draft' COMMENT '状态', `submitted_at` DATETIME NULL COMMENT '提交时间', `created_at` DATETIME NOT NULL COMMENT '创建时间(应用层写入)', `updated_at` DATETIME NOT NULL COMMENT '更新时间(应用层写入)', PRIMARY KEY (`id`), UNIQUE KEY `uk_art_uid` (`tenant_id`, `artifact_uid`), KEY `idx_art_session` (`tenant_id`, `session_id`), KEY `idx_art_blueprint` (`tenant_id`, `blueprint_id`), KEY `idx_art_creator` (`tenant_id`, `creator_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学生产出物表'; -- 表 pbl_evidence(真源 models/pbl_evidence.json) CREATE TABLE IF NOT EXISTS `pbl_evidence` ( `id` VARCHAR(32) NOT NULL COMMENT '主键', `tenant_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '租户ID(强制打头)', `artifact_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '归属产出物ID(0=无强归属)', `evidence_type` VARCHAR(64) NOT NULL DEFAULT 'observation' COMMENT '证据类型', `source_event_id` VARCHAR(32) NOT NULL COMMENT '来源runtime_event事件ID', `session_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '会话ID', `learner_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '学习者ID', `blueprint_id` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '蓝图ID', `payload_json` LONGTEXT NULL COMMENT '证据体(序列化JSON文本)', `occurred_at` DATETIME NOT NULL COMMENT '发生时间', `dedup_key` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '去重键(md5(tenant|event|type))', `collect_batch_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '采集批次ID', `created_at` DATETIME NOT NULL COMMENT '创建时间(应用层写入)', `updated_at` DATETIME NOT NULL COMMENT '更新时间(应用层写入)', PRIMARY KEY (`id`), UNIQUE KEY `uk_ev_dedup` (`tenant_id`, `source_event_id`, `evidence_type`), KEY `idx_ev_learner` (`tenant_id`, `learner_id`, `occurred_at`), KEY `idx_ev_artifact` (`tenant_id`, `artifact_id`), KEY `idx_ev_type_time` (`tenant_id`, `evidence_type`, `occurred_at`), KEY `idx_ev_batch` (`tenant_id`, `collect_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习证据表';