diff --git a/sql/pbl_evidence.sql b/sql/pbl_evidence.sql index 81a708e..97a87ba 100644 --- a/sql/pbl_evidence.sql +++ b/sql/pbl_evidence.sql @@ -1,41 +1,59 @@ --- pbl_evidence 表 DDL(自动生成,与 apps/pbls/scripts/ddl/pbls_tables.sql 同源) +-- 本文件由 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` ( - `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), - `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, - `artifact_uid` VARCHAR(32) NOT NULL COMMENT "产出UID", - `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", - `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", - `team_id` BIGINT UNSIGNED NOT NULL COMMENT "团队", - `creator_id` VARCHAR(32) NOT NULL COMMENT "作者", - `title` VARCHAR(128) NOT NULL COMMENT "标题", - `artifact_type` VARCHAR(64) NOT NULL COMMENT "类型", - `content_json` LONGTEXT NULL COMMENT "内容", - `version_no` INT NOT NULL DEFAULT 0 COMMENT "版本", - `status` VARCHAR(64) NOT NULL COMMENT "状态", - `submitted_at` DATETIME NULL NULL COMMENT "提交时间", - `created_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "创建时间(应用层写入)", - `updated_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "更新时间(应用层写入)", + `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`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="学生产出物(版本内联 version_no)"; + 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` ( - `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), - `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, - `artifact_id` BIGINT UNSIGNED NOT NULL COMMENT "产出物", - `evidence_type` VARCHAR(64) NOT NULL COMMENT "证据类型", - `source_event_id` VARCHAR(32) NOT NULL COMMENT "来源 runtime_event", - `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", - `learner_id` VARCHAR(32) NOT NULL COMMENT "学习者", - `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", - `payload_json` LONGTEXT NULL COMMENT "证据体", - `occurred_at` DATETIME NOT NULL COMMENT "发生时间", - `dedup_key` VARCHAR(32) NOT NULL COMMENT "去重键", - `created_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "创建时间(应用层写入)", - `updated_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "更新时间(应用层写入)", + `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`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="学习证据(幂等采集,唯一索引防重)"; - + 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='学习证据表';