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

111 lines
4.6 KiB
SQL
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.
-- ===================================================================
-- 基于ak_contents的商品扩展方案不推荐但可行
-- ===================================================================
-- 1. 为ak_contents添加商品相关字段
DO $$
BEGIN
-- 添加内容类型字段区分资讯和商品
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='content_type') THEN
ALTER TABLE public.ak_contents ADD COLUMN content_type VARCHAR(50) DEFAULT 'article';
COMMENT ON COLUMN public.ak_contents.content_type IS '内容类型article=资讯product=商品';
END IF;
-- 添加商品特有字段
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='product_code') THEN
ALTER TABLE public.ak_contents ADD COLUMN product_code VARCHAR(50);
COMMENT ON COLUMN public.ak_contents.product_code IS '商品编码(仅商品类型使用)';
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='base_price') THEN
ALTER TABLE public.ak_contents ADD COLUMN base_price DECIMAL(12,2);
COMMENT ON COLUMN public.ak_contents.base_price IS '商品基础价格(仅商品类型使用)';
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='stock_quantity') THEN
ALTER TABLE public.ak_contents ADD COLUMN stock_quantity INTEGER DEFAULT 0;
COMMENT ON COLUMN public.ak_contents.stock_quantity IS '库存数量(仅商品类型使用)';
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='ak_contents' AND column_name='merchant_id') THEN
ALTER TABLE public.ak_contents ADD COLUMN merchant_id UUID;
COMMENT ON COLUMN public.ak_contents.merchant_id IS '商家ID仅商品类型使用';
END IF;
END
$$;
-- 2. 创建商品特有的附加表
-- 商品SKU表
CREATE TABLE IF NOT EXISTS public.ak_product_skus (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE,
sku_code VARCHAR(100) UNIQUE NOT NULL,
specification_values JSONB NOT NULL DEFAULT '{}',
price DECIMAL(12,2) NOT NULL,
stock_quantity INTEGER DEFAULT 0,
is_default BOOLEAN DEFAULT false,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 商品规格表
CREATE TABLE IF NOT EXISTS public.ak_product_specifications (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE,
spec_name VARCHAR(100) NOT NULL,
spec_values TEXT[] NOT NULL,
is_required BOOLEAN DEFAULT false,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 商品属性表
CREATE TABLE IF NOT EXISTS public.ak_product_attributes (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
content_id UUID NOT NULL REFERENCES public.ak_contents(id) ON DELETE CASCADE,
attribute_name VARCHAR(200) NOT NULL,
attribute_value TEXT NOT NULL,
attribute_group VARCHAR(100),
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 3. 创建专门的商品视图
CREATE OR REPLACE VIEW public.vw_products AS
SELECT
id,
title as product_name,
content as product_description,
product_code,
base_price,
stock_quantity,
merchant_id,
category_id,
status,
tags,
published_at as listed_at,
created_at,
updated_at,
-- 排除资讯相关字段
NULL as ai_analysis_result,
NULL as translation_status
FROM public.ak_contents
WHERE content_type = 'product';
-- 4. 添加约束和索引
ALTER TABLE public.ak_contents ADD CONSTRAINT chk_product_code_unique
CHECK (content_type != 'product' OR product_code IS NOT NULL);
CREATE INDEX IF NOT EXISTS idx_ak_contents_product_type ON public.ak_contents(content_type) WHERE content_type = 'product';
CREATE INDEX IF NOT EXISTS idx_ak_contents_product_code ON public.ak_contents(product_code) WHERE content_type = 'product';
CREATE INDEX IF NOT EXISTS idx_ak_contents_merchant ON public.ak_contents(merchant_id) WHERE content_type = 'product';
-- 注意事项和限制
COMMENT ON VIEW public.vw_products IS '
使用ak_contents作为商品表的注意事项
1. 必须设置content_type=product来区分商品和资讯
2. 许多ak_contents的字段对商品无意义如AI翻译相关
3. 查询性能可能受影响,建议添加分区
4. 推荐使用独立的商品表设计以获得更好的架构
';