32 lines
1.2 KiB
MySQL
32 lines
1.2 KiB
MySQL
|
|
-- Migration: Create playlists and playlist_tracks tables
|
||
|
|
-- T0296: Create Playlist Database Model
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS playlists (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
|
|
title VARCHAR(200) NOT NULL,
|
||
|
|
description TEXT,
|
||
|
|
is_public BOOLEAN DEFAULT TRUE,
|
||
|
|
cover_url VARCHAR(500),
|
||
|
|
track_count INTEGER DEFAULT 0,
|
||
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS playlist_tracks (
|
||
|
|
id BIGSERIAL PRIMARY KEY,
|
||
|
|
playlist_id BIGINT NOT NULL REFERENCES playlists(id) ON DELETE CASCADE,
|
||
|
|
track_id BIGINT NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
||
|
|
position INTEGER NOT NULL,
|
||
|
|
added_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
UNIQUE(playlist_id, track_id)
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Indexes for performance
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_playlists_user_id ON playlists(user_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_playlist_tracks_playlist_id ON playlist_tracks(playlist_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_playlist_tracks_track_id ON playlist_tracks(track_id);
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_playlist_tracks_position ON playlist_tracks(playlist_id, position);
|
||
|
|
|
||
|
|
|