-- ===================================================================== -- pbl_domain_ext —— [M8] 基础域薄扩展 world/scene/entity -- 由 models/pbl_domain_ref.json 生成(json2ddl mysql .),列名/类型与 -- models fields、pbl_domain_ext/base.py LIST_FIELDS 严格同名同型(QC#1/#2)。 -- -- 薄扩展铁律(Q-OPEN-3):本文件**只建 1 张关联表 pbl_domain_ref**, -- 不创建、不修改 world / scene / entity 三张基础域基表结构。 -- ===================================================================== -- --------------------------------------------------------------------- -- 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` VARCHAR(64) NOT NULL COMMENT '基表记录ID(world.id/scene.id/entity.id,基表主键为str32)', `ref_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '基表记录编码快照(只读冗余,不回写基表)', `ref_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '基表记录名称快照(只读冗余,不回写基表)', `blueprint_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '关联蓝图ID(pbl_blueprint主键,str32)', `class_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '班级ID', `team_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '团队ID', `bind_state` VARCHAR(16) NOT NULL DEFAULT 'bound' COMMENT '绑定状态(bound/unbound)', `bind_at` TIMESTAMP NULL COMMENT '绑定时间', `ext_json` LONGTEXT NULL COMMENT '扩展JSON(租户/班级/团队关联属性,设计§J1权威名)', `is_deleted` SMALLINT NOT NULL DEFAULT 0 COMMENT '逻辑删除标记(0正常/1已解绑)', `creator_id` VARCHAR(64) NULL COMMENT '创建人', `created_at` TIMESTAMP NOT NULL COMMENT '创建时间', `updater_id` VARCHAR(64) NULL COMMENT '更新人', `updated_at` TIMESTAMP NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_pbl_domain_ref` (`tenant_id`, `ref_type`, `ref_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`), KEY `idx_pbl_domain_ref_state` (`tenant_id`, `bind_state`, `is_deleted`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL基础域薄扩展关联表(world/scene/entity)'; -- --------------------------------------------------------------------- -- 2. 字典: pbl_domain_ref_type / pbl_bind_state -- models.codes 引用 appcodes_kv, cond 必须 parentid=(禁 id=) -- appcodes 与 appcodes_kv 必须成对写入 -- --------------------------------------------------------------------- INSERT INTO `appcodes` (`id`, `name`, `hierarchy_flg`) VALUES ('pbl_domain_ref_type', 'PBL关联对象类型', '0'), ('pbl_bind_state', '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', '实体'), ('pbl_bs_bound', 'pbl_bind_state', 'bound', '已绑定'), ('pbl_bs_unbound', 'pbl_bind_state', 'unbound', '已解绑') 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;