-- ===================================================================== -- pbl_domain_ext (M8) 基础域薄扩展 world/scene/entity -- 权威表定义: models/pbl_domain_ref.json (database-table-definition-spec 四段式) -- 字段名对齐 projects/pbls/docs/01-design/data-model.md §J1: ext_json LONGTEXT -- 约束: 仅新增关联表, 不改 world / scene / entity 三张基表结构 (Q-OPEN-3) -- 幂等: 全部 IF NOT EXISTS / ON DUPLICATE KEY UPDATE, 可重复执行 -- ===================================================================== -- --------------------------------------------------------------------- -- 1. 关联表 pbl_domain_ref (唯一新增表) -- --------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `pbl_domain_ref` ( `id` VARCHAR(32) NOT NULL COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID(打头)', `ref_type` VARCHAR(32) NOT NULL COMMENT '关联对象类型(world/scene/entity)', `ref_id` BIGINT NOT NULL COMMENT '基表记录ID(world.id/scene.id/entity.id)', `blueprint_id` BIGINT DEFAULT NULL COMMENT '关联蓝图ID', `class_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '班级ID', `team_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '团队ID', `ext_json` LONGTEXT DEFAULT NULL COMMENT '扩展JSON(租户/班级/团队关联属性)', `created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_by` VARCHAR(64) DEFAULT NULL COMMENT '更新人', `updated_at` TIMESTAMP NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_domain_ref` (`tenant_id`, `ref_type`, `ref_id`, `class_id`, `team_id`), KEY `idx_pbl_domain_ref_tenant_type` (`tenant_id`, `ref_type`), KEY `idx_pbl_domain_ref_blueprint` (`tenant_id`, `blueprint_id`), KEY `idx_pbl_domain_ref_class` (`tenant_id`, `class_id`), KEY `idx_pbl_domain_ref_team` (`tenant_id`, `team_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='PBL基础域薄扩展关联表(world/scene/entity)'; -- --------------------------------------------------------------------- -- 2. 字典: pbl_domain_ref_type (models.codes 引用 appcodes_kv, cond=parentid=) -- appcodes 与 appcodes_kv 必须成对写入 -- --------------------------------------------------------------------- INSERT INTO `appcodes` (`id`, `name`, `hierarchy_flg`) VALUES ('pbl_domain_ref_type', 'PBL关联对象类型', '0') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`); INSERT INTO `appcodes_kv` (`id`, `parentid`, `k`, `v`) VALUES ('pbl_drt_world', 'pbl_domain_ref_type', 'world', '世界'), ('pbl_drt_scene', 'pbl_domain_ref_type', 'scene', '场景'), ('pbl_drt_entity', 'pbl_domain_ref_type', 'entity', '实体') ON DUPLICATE KEY UPDATE `v` = VALUES(`v`); -- --------------------------------------------------------------------- -- 3. 迁移兼容: 历史版本曾用列名 `ext`(json), 统一为设计权威名 ext_json(LONGTEXT) -- 存在旧列时搬迁数据后删除, 保证 models / sql / api 三处同名同型 -- --------------------------------------------------------------------- -- (由部署脚本按 information_schema 判定后执行, 此处保留语句备查) -- SET @has_ext := (SELECT COUNT(*) FROM information_schema.COLUMNS -- WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_domain_ref' AND COLUMN_NAME = 'ext'); -- SET @sql := IF(@has_ext > 0, -- 'UPDATE pbl_domain_ref SET ext_json = CAST(ext AS CHAR) WHERE ext_json IS NULL AND ext IS NOT NULL', -- 'SELECT 1'); -- PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s; -- SET @sql2 := IF(@has_ext > 0, 'ALTER TABLE pbl_domain_ref DROP COLUMN ext', 'SELECT 1'); -- PREPARE s2 FROM @sql2; EXECUTE s2; DEALLOCATE PREPARE s2; -- --------------------------------------------------------------------- -- 4. 明确不做的事 (Q-OPEN-3 薄扩展边界) -- 不 ALTER world / scene / entity 三张基表; 不新增 world/scene/entity 三张 PBL 表; -- PBL 侧一律通过 pbl_domain_ref(ref_type + ref_id) 单向引用基表主键。 -- ---------------------------------------------------------------------