780beaa248
Three tables keyed on (user_id, entity_id) with liked_at. Per-table indexes on (user_id, liked_at DESC) for the recently-liked feed. sqlc queries cover like/unlike/list-rows/count/list-ids per entity.
28 lines
1.3 KiB
SQL
28 lines
1.3 KiB
SQL
-- M2 likes: three tables, one per entity type. Schema follows the spec §5
|
|
-- pattern (general_likes was originally track-only); this slice extends it
|
|
-- to albums and artists for full Subsonic star/unstar support.
|
|
|
|
CREATE TABLE general_likes (
|
|
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
track_id uuid NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
|
liked_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (user_id, track_id)
|
|
);
|
|
CREATE INDEX general_likes_user_liked_at_idx ON general_likes (user_id, liked_at DESC);
|
|
|
|
CREATE TABLE general_likes_albums (
|
|
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
album_id uuid NOT NULL REFERENCES albums(id) ON DELETE CASCADE,
|
|
liked_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (user_id, album_id)
|
|
);
|
|
CREATE INDEX general_likes_albums_user_liked_at_idx ON general_likes_albums (user_id, liked_at DESC);
|
|
|
|
CREATE TABLE general_likes_artists (
|
|
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
artist_id uuid NOT NULL REFERENCES artists(id) ON DELETE CASCADE,
|
|
liked_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (user_id, artist_id)
|
|
);
|
|
CREATE INDEX general_likes_artists_user_liked_at_idx ON general_likes_artists (user_id, liked_at DESC);
|