gcx/backend/migrations/047_create_referral_profile...

52 lines
1.6 KiB
PL/PgSQL

-- Migration 047: Create referral_profiles table
-- 推荐关系表: 每个用户一条记录,记录推荐码、推荐人、推荐链
CREATE TABLE IF NOT EXISTS referral_profiles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- 用户 ID (对应 users.id)
user_id UUID NOT NULL,
-- 此用户的推荐码 (用于邀请他人注册)
referral_code VARCHAR(20) NOT NULL,
-- 推荐人 userId (注册时使用了他人推荐码时才有值)
referrer_id UUID,
-- 注册时填写的推荐码 (即推荐人的推荐码)
used_code VARCHAR(20),
-- 推荐链: 从直接推荐人到顶层的 userId 数组 (PostgreSQL 原生 text[])
referral_chain TEXT[] NOT NULL DEFAULT '{}',
-- 直推下级人数
direct_referral_count INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 唯一约束
CREATE UNIQUE INDEX IF NOT EXISTS idx_referral_profiles_user
ON referral_profiles(user_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_referral_profiles_code
ON referral_profiles(referral_code);
-- 推荐人查询加速
CREATE INDEX IF NOT EXISTS idx_referral_profiles_referrer
ON referral_profiles(referrer_id);
-- updated_at 自动更新触发器
CREATE OR REPLACE FUNCTION update_referral_profiles_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_referral_profiles_updated_at
BEFORE UPDATE ON referral_profiles
FOR EACH ROW EXECUTE FUNCTION update_referral_profiles_updated_at();