158 lines
12 KiB
SQL
158 lines
12 KiB
SQL
-- =====================================================================
|
||
-- PBL M1b DDL —— pbl_blueprint 模板 / 子对象扩展 / 关联表
|
||
-- ---------------------------------------------------------------------
|
||
-- 权威文件:本文件是 M1b 唯一的 DDL 来源(supersedes sql/m1b_template.sql)。
|
||
-- 方言 :MariaDB 10.x / MySQL 8.x —— InnoDB + utf8mb4 + bigint AUTO_INCREMENT
|
||
-- (不使用 BIGSERIAL / nextval 等 PostgreSQL 语法)
|
||
-- 幂等 :4 张表全部 CREATE TABLE IF NOT EXISTS;索引内联在建表语句中,
|
||
-- 表已存在时整条语句跳过,重复执行不报错、不产生副作用。
|
||
--
|
||
-- Q-OPEN-3 裁决落地(硬约束):
|
||
-- 1) 本文件只对 pbl_ 前缀的 4 张自有表建表,不触碰任何既有基表的结构与数据;
|
||
-- 2) 全文件零 FOREIGN KEY —— 跨表引用一律软引用(ref_table + ref_id 字符串);
|
||
-- 3) 基表扩展需求全部落到本文件的 pbl_subobject_ext / pbl_blueprint_ref。
|
||
--
|
||
-- 多租户约定:
|
||
-- tenant_id 允许 NULL —— NULL 表示「平台公共」(如平台公共模板);
|
||
-- tenant_key NOT NULL DEFAULT '' —— 由 tenant_id 归一化而来(NULL -> ''),
|
||
-- 所有 UNIQUE KEY 一律以 tenant_key 打头,规避 MySQL/MariaDB
|
||
-- 唯一索引把多个 NULL 视为互不相等而产生重复行的问题。
|
||
--
|
||
-- 表清单(4 张,与 models/m1b/*.json 四段式表定义一一对应):
|
||
-- 1. pbl_blueprint_template 蓝图模板(含平台公共模板)
|
||
-- 2. pbl_blueprint_ref 蓝图关联表(软引用外部对象)
|
||
-- 3. pbl_subobject_ext 子对象扩展值(KV,基表零改动)
|
||
-- 4. pbl_ext_field_def 扩展字段定义(元数据)
|
||
-- =====================================================================
|
||
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- 1/4 pbl_blueprint_template —— 蓝图模板(含平台公共模板 tenant_id IS NULL)
|
||
-- ---------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `pbl_blueprint_template` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`tenant_key` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户键(归一化,空串=平台公共),唯一索引打头列',
|
||
`tenant_id` VARCHAR(64) DEFAULT NULL COMMENT '租户ID,NULL=平台公共模板',
|
||
`template_code` VARCHAR(64) NOT NULL COMMENT '模板编码(租户内唯一)',
|
||
`template_name` VARCHAR(200) NOT NULL COMMENT '模板名称',
|
||
`scope` VARCHAR(32) NOT NULL DEFAULT 'tenant' COMMENT '可见范围:platform=平台公共/tenant=租户私有',
|
||
`category` VARCHAR(64) DEFAULT NULL COMMENT '模板分类(学科/主题)',
|
||
`description` TEXT COMMENT '模板说明',
|
||
`blueprint_payload` LONGTEXT COMMENT '模板蓝图JSON快照(实例化时深拷贝)',
|
||
`subobject_payload` LONGTEXT COMMENT '模板子对象集合JSON快照',
|
||
`ref_payload` LONGTEXT COMMENT '模板关联表条目JSON快照(pbl_blueprint_ref)',
|
||
`version` VARCHAR(32) NOT NULL DEFAULT '1.0.0' COMMENT '模板版本号',
|
||
`status` VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT '状态:draft/published/offline',
|
||
`is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '是否租户默认模板:1=是',
|
||
`usage_count` INT NOT NULL DEFAULT 0 COMMENT '被实例化次数(统计)',
|
||
`source_blueprint_id` BIGINT DEFAULT NULL COMMENT '来源蓝图ID(由蓝图另存为模板时回填,软引用)',
|
||
`created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
||
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
|
||
`updated_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
||
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_tpl_tenant_code` (`tenant_key`, `template_code`),
|
||
KEY `idx_tpl_tenant_status` (`tenant_key`, `status`),
|
||
KEY `idx_tpl_scope` (`scope`, `status`),
|
||
KEY `idx_tpl_category` (`tenant_key`, `category`),
|
||
KEY `idx_tpl_updated` (`updated_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='PBL蓝图模板(M1b)';
|
||
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- 2/4 pbl_blueprint_ref —— 蓝图关联表(蓝图 <-> 外部对象 软引用)
|
||
-- Q-OPEN-3:不改任何既有基表,蓝图与基表对象的关系全部由本表承载
|
||
-- (ref_table 记录被引用表名 + ref_id 记录被引用主键,只读引用零写入)。
|
||
-- ---------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `pbl_blueprint_ref` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`tenant_key` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户键(归一化),唯一索引打头列',
|
||
`tenant_id` VARCHAR(64) DEFAULT NULL COMMENT '租户ID',
|
||
`blueprint_id` BIGINT NOT NULL COMMENT '蓝图ID(软引用 pbl_blueprint.id,不建外键)',
|
||
`ref_type` VARCHAR(32) NOT NULL COMMENT '引用类型:world/scene/entity/script/template/other',
|
||
`ref_table` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '被引用基表名(只读引用,零写入)',
|
||
`ref_id` VARCHAR(64) NOT NULL COMMENT '被引用对象主键(字符串以兼容异构基表)',
|
||
`ref_name` VARCHAR(200) DEFAULT NULL COMMENT '被引用对象名称快照(展示用,避免跨库JOIN)',
|
||
`relation_kind` VARCHAR(32) NOT NULL DEFAULT 'reference' COMMENT '关系语义:reference/derived/instantiated',
|
||
`ref_payload` TEXT COMMENT '关系扩展属性JSON',
|
||
`sort_no` INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
||
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '状态:active/inactive',
|
||
`created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
||
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
|
||
`updated_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
||
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_ref_tenant_bp_ref` (`tenant_key`, `blueprint_id`, `ref_type`, `ref_id`),
|
||
KEY `idx_ref_tenant_target` (`tenant_key`, `ref_type`, `ref_id`),
|
||
KEY `idx_ref_blueprint` (`blueprint_id`, `status`),
|
||
KEY `idx_ref_table` (`ref_table`, `ref_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='PBL蓝图关联表(M1b,Q-OPEN-3软引用)';
|
||
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- 3/4 pbl_subobject_ext —— 子对象扩展(7 类子对象泛化契约的扩展值存储)
|
||
-- 基表零改动:扩展值以 KV 形式落本表,字段合法性由 pbl_ext_field_def 约束。
|
||
-- ---------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `pbl_subobject_ext` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`tenant_key` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户键(归一化),唯一索引打头列',
|
||
`tenant_id` VARCHAR(64) DEFAULT NULL COMMENT '租户ID',
|
||
`blueprint_id` BIGINT NOT NULL COMMENT '所属蓝图ID(软引用)',
|
||
`subobject_type` VARCHAR(32) NOT NULL COMMENT '子对象类型(7类泛化契约之一)',
|
||
`subobject_id` VARCHAR(64) NOT NULL COMMENT '子对象在基表的主键(字符串以兼容异构基表)',
|
||
`ext_key` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '扩展字段键(空串=整对象级扩展)',
|
||
`ext_value` LONGTEXT COMMENT '扩展值(按 ext_value_type 解释)',
|
||
`ext_value_type` VARCHAR(16) NOT NULL DEFAULT 'string' COMMENT '值类型:string/number/bool/json/date',
|
||
`field_def_id` BIGINT DEFAULT NULL COMMENT '扩展字段定义ID(软引用 pbl_ext_field_def.id)',
|
||
`source` VARCHAR(32) NOT NULL DEFAULT 'manual' COMMENT '来源:manual/template/agent/import',
|
||
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '状态:active/inactive',
|
||
`created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
||
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
|
||
`updated_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
||
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_ext_tenant_obj_key` (`tenant_key`, `subobject_type`, `subobject_id`, `ext_key`),
|
||
KEY `idx_ext_tenant_bp_type` (`tenant_key`, `blueprint_id`, `subobject_type`),
|
||
KEY `idx_ext_obj` (`subobject_type`, `subobject_id`),
|
||
KEY `idx_ext_field_def` (`field_def_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='PBL子对象扩展值(M1b,基表零改动)';
|
||
|
||
|
||
-- ---------------------------------------------------------------------
|
||
-- 4/4 pbl_ext_field_def —— 扩展字段定义(元数据:约束每类子对象可扩展哪些字段)
|
||
-- scope='platform' 且 tenant_id IS NULL 时为平台公共字段定义,
|
||
-- 租户级定义覆盖同 field_key 的平台定义(读取顺序:tenant -> platform)。
|
||
-- ---------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `pbl_ext_field_def` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`tenant_key` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户键(归一化,空串=平台公共),唯一索引打头列',
|
||
`tenant_id` VARCHAR(64) DEFAULT NULL COMMENT '租户ID,NULL=平台公共字段定义',
|
||
`subobject_type` VARCHAR(32) NOT NULL COMMENT '适用的子对象类型',
|
||
`field_key` VARCHAR(64) NOT NULL COMMENT '扩展字段键(对应 pbl_subobject_ext.ext_key)',
|
||
`field_label` VARCHAR(200) NOT NULL COMMENT '字段显示名',
|
||
`field_type` VARCHAR(16) NOT NULL DEFAULT 'string' COMMENT '字段类型:string/number/bool/json/date/enum',
|
||
`required` TINYINT NOT NULL DEFAULT 0 COMMENT '是否必填:1=是',
|
||
`default_value` VARCHAR(500) DEFAULT NULL COMMENT '默认值',
|
||
`options_json` TEXT COMMENT '枚举选项JSON(field_type=enum 时有效)',
|
||
`validation_json` TEXT COMMENT '校验规则JSON(min/max/pattern/maxLength)',
|
||
`scope` VARCHAR(32) NOT NULL DEFAULT 'tenant' COMMENT '可见范围:platform/tenant',
|
||
`sort_no` INT NOT NULL DEFAULT 0 COMMENT '表单排序号',
|
||
`status` VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '状态:active/inactive',
|
||
`created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
||
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
|
||
`updated_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
||
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_def_tenant_type_field` (`tenant_key`, `subobject_type`, `field_key`),
|
||
KEY `idx_def_type_status` (`subobject_type`, `status`),
|
||
KEY `idx_def_scope` (`scope`, `status`),
|
||
KEY `idx_def_tenant` (`tenant_key`, `status`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='PBL扩展字段定义(M1b元数据)';
|
||
|
||
-- =====================================================================
|
||
-- 文件结束:4 张表,0 个 FOREIGN KEY,0 条针对既有基表的语句。
|
||
-- 本文件只含 CREATE TABLE IF NOT EXISTS(4 条),不含任何其它 DDL/DML 动词,
|
||
-- 因此对既有基表(world / scene / entity / script 等)零影响。
|
||
-- 机械核验由 tools/m1b_selfcheck.py 的 check_ddl() 自动执行并输出证据。
|
||
-- =====================================================================
|