72 lines
4.8 KiB
SQL
72 lines
4.8 KiB
SQL
-- =====================================================================
|
||
-- 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;
|