feat: add database migration for field_roles and slot_definitions [AC-MRS-01,07]

This commit is contained in:
MerCry 2026-03-05 17:11:36 +08:00
parent d534b4ef32
commit 14d1737728
1 changed files with 63 additions and 0 deletions

View File

@ -0,0 +1,63 @@
-- Migration: Add field_roles and slot_definitions
-- Date: 2026-03-05
-- Issue: [AC-MRS-01, AC-MRS-07] 元数据职责分层优化
-- 1. 为 metadata_field_definitions 表新增 field_roles 字段
ALTER TABLE metadata_field_definitions
ADD COLUMN IF NOT EXISTS field_roles JSONB DEFAULT '[]'::jsonb;
-- 2. 创建 GIN 索引支持按角色查询
CREATE INDEX IF NOT EXISTS idx_metadata_field_definitions_roles
ON metadata_field_definitions USING GIN (field_roles);
-- 3. 添加字段注释
COMMENT ON COLUMN metadata_field_definitions.field_roles IS
'[AC-MRS-01] 字段角色列表resource_filter, slot, prompt_var, routing_signal';
-- 4. 创建 slot_definitions 表
CREATE TABLE IF NOT EXISTS slot_definitions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id VARCHAR NOT NULL,
slot_key VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL DEFAULT 'string',
required BOOLEAN NOT NULL DEFAULT FALSE,
extract_strategy VARCHAR(20),
validation_rule TEXT,
ask_back_prompt TEXT,
default_value JSONB,
linked_field_id UUID REFERENCES metadata_field_definitions(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT uk_slot_definitions_tenant_key UNIQUE (tenant_id, slot_key),
CONSTRAINT chk_slot_definitions_type CHECK (type IN ('string', 'number', 'boolean', 'enum', 'array_enum')),
CONSTRAINT chk_slot_definitions_extract_strategy CHECK (extract_strategy IS NULL OR extract_strategy IN ('rule', 'llm', 'user_input'))
);
-- 5. 创建索引
CREATE INDEX IF NOT EXISTS ix_slot_definitions_tenant
ON slot_definitions(tenant_id);
CREATE INDEX IF NOT EXISTS ix_slot_definitions_tenant_key
ON slot_definitions(tenant_id, slot_key);
CREATE INDEX IF NOT EXISTS ix_slot_definitions_linked_field
ON slot_definitions(linked_field_id);
-- 6. 添加表和字段注释
COMMENT ON TABLE slot_definitions IS '[AC-MRS-07] 槽位定义表';
COMMENT ON COLUMN slot_definitions.slot_key IS '[AC-MRS-07] 槽位键名,可与元数据字段 field_key 关联';
COMMENT ON COLUMN slot_definitions.type IS '[AC-MRS-07] 槽位类型string/number/boolean/enum/array_enum';
COMMENT ON COLUMN slot_definitions.required IS '[AC-MRS-07] 是否必填槽位';
COMMENT ON COLUMN slot_definitions.extract_strategy IS '[AC-MRS-07] 提取策略rule/llm/user_input';
COMMENT ON COLUMN slot_definitions.validation_rule IS '[AC-MRS-07] 校验规则(正则或 JSON Schema';
COMMENT ON COLUMN slot_definitions.ask_back_prompt IS '[AC-MRS-07] 追问提示语模板';
COMMENT ON COLUMN slot_definitions.default_value IS '[AC-MRS-07] 默认值';
COMMENT ON COLUMN slot_definitions.linked_field_id IS '[AC-MRS-08] 关联的元数据字段 ID';
-- 7. 初始化现有字段的默认角色(根据 is_filterable 推断 resource_filter 角色)
UPDATE metadata_field_definitions
SET field_roles = '["resource_filter"]'::jsonb
WHERE is_filterable = true
AND status = 'active'
AND (field_roles IS NULL OR field_roles = '[]'::jsonb);