Files
doodle-store/apps/server/prisma/sql/008-add-resource-favorites.sql
T
2026-10-15 10:09:34 +08:00

30 lines
1.6 KiB
PL/PgSQL

-- 已有库完成 004/005/006/007 后执行;最新空库基线包含此结构,不执行本文件。
-- 旧收藏全部保持功能收藏(新列 NULL),不猜测具体底图,不改旧 likes。
-- 删除旧唯一约束并创建两种部分唯一索引均在同一事务内完成。
BEGIN;
SET LOCAL TIME ZONE 'UTC';
SET LOCAL lock_timeout = '5s';
SET LOCAL search_path = public, pg_catalog;
ALTER TABLE public.favorites
ADD COLUMN worksheet_resource_id varchar(128) COLLATE "C",
ADD CONSTRAINT favorites_resource_id_check CHECK (
worksheet_resource_id IS NULL OR length(btrim(worksheet_resource_id)) > 0
);
ALTER TABLE public.favorites DROP CONSTRAINT favorites_user_worksheet_key;
-- NULL 表示功能收藏;非 NULL 表示完整内容收藏,不另加 type 字段。
-- 部分唯一索引分别去重,允许同用户收藏一个功能及其中多个资源。
CREATE UNIQUE INDEX favorites_user_worksheet_key
ON public.favorites (user_id, worksheet_id)
WHERE worksheet_resource_id IS NULL;
CREATE UNIQUE INDEX favorites_user_resource_key
ON public.favorites (user_id, worksheet_resource_id)
WHERE worksheet_resource_id IS NOT NULL;
COMMENT ON TABLE public.favorites IS '功能和完整内容的当前收藏;取消即删除;仅功能收藏增减 worksheets.likes';
COMMENT ON COLUMN public.favorites.worksheet_id IS '稳定功能逻辑关联;内容收藏的功能归属由服务端查询确定,历史缺失时保留';
COMMENT ON COLUMN public.favorites.worksheet_resource_id IS 'NULL 是功能收藏,非 NULL 是完整内容收藏;逻辑关联,缺失/下架不清空,不退化为功能收藏';
COMMIT;