60
play-life-backend/migrations/000014_add_group_name.up.sql
Normal file
60
play-life-backend/migrations/000014_add_group_name.up.sql
Normal file
@@ -0,0 +1,60 @@
|
||||
-- Migration: Add group_name field to wishlist_items and tasks tables
|
||||
-- Date: 2026-02-XX
|
||||
--
|
||||
-- This migration:
|
||||
-- 1. Adds group_name field to wishlist_items (replacing project_id)
|
||||
-- 2. Migrates existing data from project_id to group_name
|
||||
-- 3. Removes project_id column from wishlist_items
|
||||
-- 4. Adds group_name field to tasks
|
||||
-- 5. Creates materialized view for group suggestions
|
||||
|
||||
-- Step 1: Add group_name to wishlist_items
|
||||
ALTER TABLE wishlist_items
|
||||
ADD COLUMN group_name VARCHAR(255);
|
||||
|
||||
-- Step 2: Migrate existing data from project_id to group_name
|
||||
UPDATE wishlist_items wi
|
||||
SET group_name = p.name
|
||||
FROM projects p
|
||||
WHERE wi.project_id = p.id AND wi.project_id IS NOT NULL;
|
||||
|
||||
-- Step 3: Remove project_id column and its index
|
||||
DROP INDEX IF EXISTS idx_wishlist_items_project_id;
|
||||
ALTER TABLE wishlist_items
|
||||
DROP COLUMN project_id;
|
||||
|
||||
-- Step 4: Add group_name to tasks
|
||||
ALTER TABLE tasks
|
||||
ADD COLUMN group_name VARCHAR(255);
|
||||
|
||||
-- Step 5: Create indexes on group_name
|
||||
CREATE INDEX idx_wishlist_items_group_name ON wishlist_items(group_name) WHERE group_name IS NOT NULL;
|
||||
CREATE INDEX idx_tasks_group_name ON tasks(group_name) WHERE group_name IS NOT NULL;
|
||||
|
||||
-- Step 6: Create materialized view for group suggestions
|
||||
CREATE MATERIALIZED VIEW user_group_suggestions_mv AS
|
||||
SELECT DISTINCT user_id, group_name FROM (
|
||||
-- Желания пользователя (собственные)
|
||||
SELECT wi.user_id, wi.group_name FROM wishlist_items wi
|
||||
WHERE wi.deleted = FALSE AND wi.group_name IS NOT NULL AND wi.group_name != ''
|
||||
UNION
|
||||
-- Желания с досок, на которых пользователь участник
|
||||
SELECT wbm.user_id, wi.group_name FROM wishlist_items wi
|
||||
JOIN wishlist_board_members wbm ON wi.board_id = wbm.board_id
|
||||
WHERE wi.deleted = FALSE AND wi.group_name IS NOT NULL AND wi.group_name != ''
|
||||
UNION
|
||||
-- Задачи пользователя
|
||||
SELECT t.user_id, t.group_name FROM tasks t
|
||||
WHERE t.deleted = FALSE AND t.group_name IS NOT NULL AND t.group_name != ''
|
||||
UNION
|
||||
-- Имена проектов пользователя
|
||||
SELECT p.user_id, p.name FROM projects p
|
||||
WHERE p.deleted = FALSE
|
||||
) sub;
|
||||
|
||||
-- Step 7: Create unique index for CONCURRENT refresh
|
||||
CREATE UNIQUE INDEX idx_user_group_suggestions_mv_user_group ON user_group_suggestions_mv(user_id, group_name);
|
||||
|
||||
COMMENT ON COLUMN wishlist_items.group_name IS 'Group name for wishlist item (free text, replaces project_id)';
|
||||
COMMENT ON COLUMN tasks.group_name IS 'Group name for task (free text)';
|
||||
COMMENT ON MATERIALIZED VIEW user_group_suggestions_mv IS 'Materialized view for group name suggestions per user';
|
||||
Reference in New Issue
Block a user