pbl_blueprint/sql/m1b_ddl.sql
2026-09-16 19:36:42 +08:00

158 lines
12 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- 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 KEY0 条针对既有基表的语句。
-- 本文件只含 CREATE TABLE IF NOT EXISTS4 条),不含任何其它 DDL/DML 动词,
-- 因此对既有基表world / scene / entity / script 等)零影响。
-- 机械核验由 tools/m1b_selfcheck.py 的 check_ddl() 自动执行并输出证据。
-- =====================================================================