CREATE TABLE IF NOT EXISTS member_profiles ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE, family_id UUID NOT NULL REFERENCES families(id) ON DELETE CASCADE, slug TEXT NOT NULL UNIQUE, display_name TEXT NOT NULL, bio TEXT, avatar_url TEXT, is_public BOOLEAN NOT NULL DEFAULT false, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS recommended_products ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), profile_id UUID NOT NULL REFERENCES member_profiles(id) ON DELETE CASCADE, title TEXT NOT NULL, description TEXT, url TEXT NOT NULL, image_url TEXT, category TEXT NOT NULL DEFAULT 'general', display_order INTEGER NOT NULL DEFAULT 0, is_active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS product_clicks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), product_id UUID NOT NULL REFERENCES recommended_products(id) ON DELETE CASCADE, clicked_at TIMESTAMPTZ NOT NULL DEFAULT now(), referrer TEXT, ip_hash TEXT ); CREATE INDEX IF NOT EXISTS member_profiles_slug_idx ON member_profiles (slug); CREATE INDEX IF NOT EXISTS recommended_products_profile_idx ON recommended_products (profile_id, display_order); CREATE INDEX IF NOT EXISTS product_clicks_product_idx ON product_clicks (product_id, clicked_at DESC);