Files
akmon/improved_global_config_with_translation.sql
2026-01-20 08:04:15 +08:00

548 lines
24 KiB
PL/PgSQL
Raw Permalink 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.
-- ===================================================================
-- 改进的全局配置表设计 - 主表+翻译表模式
-- 更科学的多语言支持架构
-- ===================================================================
-- 1. 主配置表 (ak_global_config)
CREATE TABLE IF NOT EXISTS public.ak_global_config (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
config_key VARCHAR(100) NOT NULL UNIQUE,
config_type VARCHAR(50) DEFAULT 'string',
config_category VARCHAR(50) DEFAULT 'general',
default_value TEXT,
is_translatable BOOLEAN DEFAULT false,
is_active BOOLEAN DEFAULT true,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 2. 配置翻译表 (ak_global_config_translations)
CREATE TABLE IF NOT EXISTS public.ak_global_config_translations (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
config_id UUID NOT NULL REFERENCES public.ak_global_config(id) ON DELETE CASCADE,
language_code VARCHAR(10) NOT NULL,
translated_value TEXT NOT NULL,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(config_id, language_code)
);
-- 3. 语言表 (检查并适配现有表结构)
DO $$
BEGIN
-- 如果 ak_languages 表不存在,则创建
IF NOT EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_schema = 'public' AND table_name = 'ak_languages'
) THEN
CREATE TABLE public.ak_languages (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
code VARCHAR(10) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
native_name VARCHAR(100) NOT NULL,
is_active BOOLEAN DEFAULT true,
is_default BOOLEAN DEFAULT false,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
RAISE NOTICE '已创建 ak_languages 表';
ELSE
RAISE NOTICE 'ak_languages 表已存在,将适配现有结构';
END IF;
END $$;
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_ak_global_config_key ON public.ak_global_config(config_key);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_active ON public.ak_global_config(is_active);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_category ON public.ak_global_config(config_category);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_translatable ON public.ak_global_config(is_translatable);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_translations_config ON public.ak_global_config_translations(config_id);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_translations_lang ON public.ak_global_config_translations(language_code);
CREATE INDEX IF NOT EXISTS idx_ak_global_config_translations_active ON public.ak_global_config_translations(is_active);
CREATE INDEX IF NOT EXISTS idx_ak_languages_code ON public.ak_languages(code);
CREATE INDEX IF NOT EXISTS idx_ak_languages_active ON public.ak_languages(is_active);
-- ===================================================================
-- 初始化语言数据
-- 注意:适配现有的 ak_languages 表结构
-- ===================================================================
-- 首先检查 ak_languages 表是否有 sort_order 字段,如果没有则添加
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'ak_languages'
AND column_name = 'sort_order'
) THEN
ALTER TABLE public.ak_languages ADD COLUMN sort_order INTEGER DEFAULT 0;
RAISE NOTICE '已为 ak_languages 表添加 sort_order 字段';
END IF;
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'ak_languages'
AND column_name = 'is_default'
) THEN
ALTER TABLE public.ak_languages ADD COLUMN is_default BOOLEAN DEFAULT false;
RAISE NOTICE '已为 ak_languages 表添加 is_default 字段';
END IF;
END $$;
-- 插入语言数据(使用安全的插入方式)
INSERT INTO public.ak_languages (code, name, native_name, is_default, sort_order) VALUES
('zh', 'Chinese Simplified', '简体中文', true, 1),
('en', 'English', 'English', false, 2),
('tw', 'Chinese Traditional', '繁體中文', false, 3),
('ja', 'Japanese', '日本語', false, 4)
ON CONFLICT (code) DO UPDATE SET
name = EXCLUDED.name,
native_name = EXCLUDED.native_name,
is_default = EXCLUDED.is_default,
sort_order = EXCLUDED.sort_order;
-- ===================================================================
-- 插入主配置数据
-- ===================================================================
INSERT INTO public.ak_global_config (config_key, config_type, config_category, is_translatable, sort_order) VALUES
-- 公司基础信息(需要翻译)
('company_name', 'string', 'company', true, 1),
('company_slogan', 'string', 'company', true, 2),
('company_address', 'string', 'company', true, 3),
-- 联系方式(不需要翻译)
('company_phone', 'string', 'contact', false, 10),
('company_email', 'string', 'contact', false, 11),
('company_icp', 'string', 'legal', false, 12),
-- 媒体资源(不需要翻译)
('company_logo_url', 'string', 'media', false, 20),
-- 社交媒体链接(不需要翻译)
('social_wechat_url', 'string', 'social', false, 30),
('social_weibo_url', 'string', 'social', false, 31),
('social_qq_url', 'string', 'social', false, 32),
('social_linkedin_url', 'string', 'social', false, 33),
('social_twitter_url', 'string', 'social', false, 34),
-- 热门搜索关键词(需要翻译)
('hot_search_1', 'string', 'search', true, 50),
('hot_search_2', 'string', 'search', true, 51),
('hot_search_3', 'string', 'search', true, 52),
('hot_search_4', 'string', 'search', true, 53),
('hot_search_5', 'string', 'search', true, 54)
ON CONFLICT (config_key) DO UPDATE SET
config_type = EXCLUDED.config_type,
config_category = EXCLUDED.config_category,
is_translatable = EXCLUDED.is_translatable,
sort_order = EXCLUDED.sort_order,
updated_at = NOW();
-- ===================================================================
-- 插入翻译数据
-- ===================================================================
-- 公司名称翻译
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '创新科技有限公司'
WHEN l.code IN ('en', 'en-US') THEN 'Innovation Technology Co., Ltd.'
WHEN l.code IN ('tw', 'zh-TW') THEN '創新科技有限公司'
WHEN l.code IN ('ja', 'ja-JP') THEN 'イノベーション技術株式会社'
ELSE '创新科技有限公司' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'company_name' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '创新科技有限公司'
WHEN l.code IN ('en', 'en-US') THEN 'Innovation Technology Co., Ltd.'
WHEN l.code IN ('tw', 'zh-TW') THEN '創新科技有限公司'
WHEN l.code IN ('ja', 'ja-JP') THEN 'イノベーション技術株式会社'
ELSE '创新科技有限公司'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 公司标语翻译
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '科技创新,未来可期'
WHEN l.code IN ('en', 'en-US') THEN 'Innovation for the Future'
WHEN l.code IN ('tw', 'zh-TW') THEN '科技創新,未來可期'
WHEN l.code IN ('ja', 'ja-JP') THEN '技術革新で未来を創る'
ELSE '科技创新,未来可期' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'company_slogan' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '科技创新,未来可期'
WHEN l.code IN ('en', 'en-US') THEN 'Innovation for the Future'
WHEN l.code IN ('tw', 'zh-TW') THEN '科技創新,未來可期'
WHEN l.code IN ('ja', 'ja-JP') THEN '技術革新で未来を創る'
ELSE '科技创新,未来可期'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 公司地址翻译
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '上海市浦东新区张江高科技园区创新路88号'
WHEN l.code IN ('en', 'en-US') THEN '88 Innovation Road, Zhangjiang Hi-Tech Park, Pudong New Area, Shanghai'
WHEN l.code IN ('tw', 'zh-TW') THEN '上海市浦東新區張江高科技園區創新路88號'
WHEN l.code IN ('ja', 'ja-JP') THEN '上海市浦東新区張江ハイテクパーク イベーション路88号'
ELSE '上海市浦东新区张江高科技园区创新路88号' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'company_address' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '上海市浦东新区张江高科技园区创新路88号'
WHEN l.code IN ('en', 'en-US') THEN '88 Innovation Road, Zhangjiang Hi-Tech Park, Pudong New Area, Shanghai'
WHEN l.code IN ('tw', 'zh-TW') THEN '上海市浦東新區張江高科技園區創新路88號'
WHEN l.code IN ('ja', 'ja-JP') THEN '上海市浦東新区張江ハイテクパーク イベーション路88号'
ELSE '上海市浦东新区张江高科技园区创新路88号'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 热门搜索关键词翻译
-- 搜索关键词1
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '人工智能'
WHEN l.code IN ('en', 'en-US') THEN 'Artificial Intelligence'
WHEN l.code IN ('tw', 'zh-TW') THEN '人工智慧'
WHEN l.code IN ('ja', 'ja-JP') THEN '人工知能'
ELSE '人工智能' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'hot_search_1' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '人工智能'
WHEN l.code IN ('en', 'en-US') THEN 'Artificial Intelligence'
WHEN l.code IN ('tw', 'zh-TW') THEN '人工智慧'
WHEN l.code IN ('ja', 'ja-JP') THEN '人工知能'
ELSE '人工智能'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 搜索关键词2
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '大数据分析'
WHEN l.code IN ('en', 'en-US') THEN 'Big Data Analytics'
WHEN l.code IN ('tw', 'zh-TW') THEN '大數據分析'
WHEN l.code IN ('ja', 'ja-JP') THEN 'ビッグデータ解析'
ELSE '大数据分析' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'hot_search_2' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '大数据分析'
WHEN l.code IN ('en', 'en-US') THEN 'Big Data Analytics'
WHEN l.code IN ('tw', 'zh-TW') THEN '大數據分析'
WHEN l.code IN ('ja', 'ja-JP') THEN 'ビッグデータ解析'
ELSE '大数据分析'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 搜索关键词3
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '物联网'
WHEN l.code IN ('en', 'en-US') THEN 'Internet of Things'
WHEN l.code IN ('tw', 'zh-TW') THEN '物聯網'
WHEN l.code IN ('ja', 'ja-JP') THEN 'IoT'
ELSE '物联网' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'hot_search_3' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '物联网'
WHEN l.code IN ('en', 'en-US') THEN 'Internet of Things'
WHEN l.code IN ('tw', 'zh-TW') THEN '物聯網'
WHEN l.code IN ('ja', 'ja-JP') THEN 'IoT'
ELSE '物联网'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 搜索关键词4
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '云计算'
WHEN l.code IN ('en', 'en-US') THEN 'Cloud Computing'
WHEN l.code IN ('tw', 'zh-TW') THEN '雲端運算'
WHEN l.code IN ('ja', 'ja-JP') THEN 'クラウドコンピューティング'
ELSE '云计算' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'hot_search_4' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '云计算'
WHEN l.code IN ('en', 'en-US') THEN 'Cloud Computing'
WHEN l.code IN ('tw', 'zh-TW') THEN '雲端運算'
WHEN l.code IN ('ja', 'ja-JP') THEN 'クラウドコンピューティング'
ELSE '云计算'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- 搜索关键词5
INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value)
SELECT c.id, l.code,
CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '区块链'
WHEN l.code IN ('en', 'en-US') THEN 'Blockchain'
WHEN l.code IN ('tw', 'zh-TW') THEN '區塊鏈'
WHEN l.code IN ('ja', 'ja-JP') THEN 'ブロックチェーン'
ELSE '区块链' -- 默认中文
END
FROM public.ak_global_config c
CROSS JOIN public.ak_languages l
WHERE c.config_key = 'hot_search_5' AND l.is_active = true
AND CASE
WHEN l.code IN ('zh', 'zh-CN') THEN '区块链'
WHEN l.code IN ('en', 'en-US') THEN 'Blockchain'
WHEN l.code IN ('tw', 'zh-TW') THEN '區塊鏈'
WHEN l.code IN ('ja', 'ja-JP') THEN 'ブロックチェーン'
ELSE '区块链'
END IS NOT NULL
ON CONFLICT (config_id, language_code) DO UPDATE SET
translated_value = EXCLUDED.translated_value,
updated_at = NOW();
-- ===================================================================
-- 插入非翻译配置项的值直接存储在主表的default_value字段
-- ===================================================================
UPDATE public.ak_global_config SET default_value = '400-123-4567' WHERE config_key = 'company_phone';
UPDATE public.ak_global_config SET default_value = 'info@innovation-tech.com' WHERE config_key = 'company_email';
UPDATE public.ak_global_config SET default_value = '沪ICP备12345678号-1' WHERE config_key = 'company_icp';
UPDATE public.ak_global_config SET default_value = '/static/company-logo.png' WHERE config_key = 'company_logo_url';
UPDATE public.ak_global_config SET default_value = 'https://weixin.qq.com/innovation-tech' WHERE config_key = 'social_wechat_url';
UPDATE public.ak_global_config SET default_value = 'https://weibo.com/innovation-tech' WHERE config_key = 'social_weibo_url';
UPDATE public.ak_global_config SET default_value = 'https://qun.qq.com/innovation-tech' WHERE config_key = 'social_qq_url';
UPDATE public.ak_global_config SET default_value = 'https://linkedin.com/company/innovation-tech' WHERE config_key = 'social_linkedin_url';
UPDATE public.ak_global_config SET default_value = 'https://twitter.com/innovation_tech' WHERE config_key = 'social_twitter_url';
-- ===================================================================
-- 创建更新时间触发器
-- ===================================================================
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- 为主配置表创建更新时间触发器
DROP TRIGGER IF EXISTS update_ak_global_config_updated_at ON public.ak_global_config;
CREATE TRIGGER update_ak_global_config_updated_at
BEFORE UPDATE ON public.ak_global_config
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- 为翻译表创建更新时间触发器
DROP TRIGGER IF EXISTS update_ak_global_config_translations_updated_at ON public.ak_global_config_translations;
CREATE TRIGGER update_ak_global_config_translations_updated_at
BEFORE UPDATE ON public.ak_global_config_translations
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- ===================================================================
-- 创建便于查询的视图
-- ===================================================================
-- 1. 多语言配置视图
CREATE OR REPLACE VIEW public.vw_global_config_multilingual AS
SELECT
gc.config_key,
gc.config_type,
gc.config_category,
gc.is_translatable,
gc.default_value,
gct.language_code,
COALESCE(gct.translated_value, gc.default_value) AS config_value,
gc.sort_order,
gc.is_active
FROM public.ak_global_config gc
LEFT JOIN public.ak_global_config_translations gct ON gc.id = gct.config_id AND gct.is_active = true
WHERE gc.is_active = true
ORDER BY gc.config_category, gc.sort_order, gc.config_key, gct.language_code;
-- 2. 单语言配置视图函数
CREATE OR REPLACE FUNCTION get_config_by_language(lang_code VARCHAR(10) DEFAULT 'zh')
RETURNS TABLE (
config_key VARCHAR(100),
config_value TEXT,
config_type VARCHAR(50),
config_category VARCHAR(50)
) AS $$
BEGIN
RETURN QUERY
SELECT
gc.config_key,
COALESCE(gct.translated_value, gc.default_value) AS config_value,
gc.config_type,
gc.config_category
FROM public.ak_global_config gc
LEFT JOIN public.ak_global_config_translations gct ON gc.id = gct.config_id
AND gct.language_code = lang_code
AND gct.is_active = true
WHERE gc.is_active = true
ORDER BY gc.config_category, gc.sort_order;
END;
$$ LANGUAGE plpgsql;
-- 3. 热门搜索关键词视图函数
CREATE OR REPLACE FUNCTION get_hot_searches(lang_code VARCHAR(10) DEFAULT 'zh')
RETURNS TABLE (
search_term TEXT,
sort_order INTEGER
) AS $$
BEGIN
RETURN QUERY
SELECT
COALESCE(gct.translated_value, gc.default_value) AS search_term,
gc.sort_order
FROM public.ak_global_config gc
LEFT JOIN public.ak_global_config_translations gct ON gc.id = gct.config_id
AND gct.language_code = lang_code
AND gct.is_active = true
WHERE gc.is_active = true
AND gc.config_category = 'search'
ORDER BY gc.sort_order;
END;
$$ LANGUAGE plpgsql;
-- 4. 单个配置值获取函数(简化接口)
CREATE OR REPLACE FUNCTION get_config_value(
p_config_key VARCHAR(100),
p_language_code VARCHAR(10) DEFAULT 'zh'
) RETURNS TEXT AS $$
DECLARE
config_value TEXT;
default_value TEXT;
BEGIN
-- 先尝试获取指定语言的翻译
SELECT t.translated_value, c.default_value
INTO config_value, default_value
FROM public.ak_global_config c
LEFT JOIN public.ak_global_config_translations t
ON c.id = t.config_id
AND t.language_code = p_language_code
AND t.is_active = true
WHERE c.config_key = p_config_key
AND c.is_active = true;
-- 返回翻译值,如果没有则返回默认值
RETURN COALESCE(config_value, default_value);
END;
$$ LANGUAGE plpgsql;
-- 5. 批量配置获取函数(参数名标准化)
CREATE OR REPLACE FUNCTION get_configs_by_language(
p_language_code VARCHAR(10) DEFAULT 'zh'
) RETURNS TABLE (
config_key VARCHAR(100),
config_value TEXT,
config_type VARCHAR(50),
config_category VARCHAR(50),
sort_order INTEGER
) AS $$
BEGIN
RETURN QUERY
SELECT
c.config_key,
COALESCE(t.translated_value, c.default_value) AS config_value,
c.config_type,
c.config_category,
c.sort_order
FROM public.ak_global_config c
LEFT JOIN public.ak_global_config_translations t
ON c.id = t.config_id
AND t.language_code = p_language_code
AND t.is_active = true
WHERE c.is_active = true
ORDER BY c.config_category, c.sort_order, c.config_key;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION get_configs_by_language IS '批量获取指定语言的配置,支持分类和排序';
-- ===================================================================
-- 创建表注释
-- ===================================================================
COMMENT ON TABLE public.ak_global_config IS '全局配置主表';
COMMENT ON TABLE public.ak_global_config_translations IS '全局配置翻译表';
COMMENT ON TABLE public.ak_languages IS '支持的语言表';
COMMENT ON COLUMN public.ak_global_config.config_key IS '配置键名(唯一)';
COMMENT ON COLUMN public.ak_global_config.config_type IS '配置值类型string, number, boolean, json';
COMMENT ON COLUMN public.ak_global_config.config_category IS '配置分类company, contact, social, search等';
COMMENT ON COLUMN public.ak_global_config.default_value IS '默认值(用于不需要翻译的配置项)';
COMMENT ON COLUMN public.ak_global_config.is_translatable IS '是否需要多语言翻译';
COMMENT ON COLUMN public.ak_global_config_translations.config_id IS '关联的配置项ID';
COMMENT ON COLUMN public.ak_global_config_translations.language_code IS '语言代码';
COMMENT ON COLUMN public.ak_global_config_translations.translated_value IS '翻译后的值';
COMMENT ON VIEW public.vw_global_config_multilingual IS '多语言配置视图';
COMMENT ON FUNCTION get_config_by_language IS '获取指定语言的配置函数';
COMMENT ON FUNCTION get_hot_searches IS '获取指定语言的热门搜索关键词函数';
COMMENT ON FUNCTION get_config_value IS '获取单个配置项的值,支持多语言回退';
-- ===================================================================
-- 完成信息
-- ===================================================================
DO $$
BEGIN
RAISE NOTICE '========================================';
RAISE NOTICE '改进的全局配置表结构初始化完成!';
RAISE NOTICE '========================================';
RAISE NOTICE '主要改进:';
RAISE NOTICE '1. 主表+翻译表分离设计,结构更清晰';
RAISE NOTICE '2. 通过 is_translatable 字段区分是否需要翻译';
RAISE NOTICE '3. 配置分类管理,便于按类别查询';
RAISE NOTICE '4. 提供多语言视图和函数,查询更便捷';
RAISE NOTICE '5. 支持语言管理,可动态添加新语言';
RAISE NOTICE '========================================';
RAISE NOTICE '使用示例:';
RAISE NOTICE '-- 获取中文配置SELECT * FROM get_config_by_language(''zh'');';
RAISE NOTICE '-- 获取英文热门搜索SELECT * FROM get_hot_searches(''en'');';
RAISE NOTICE '-- 查看所有多语言配置SELECT * FROM vw_global_config_multilingual;';
RAISE NOTICE '========================================';
END
$$;