61 lines
2.6 KiB
MySQL
61 lines
2.6 KiB
MySQL
|
|
-- 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';
|