diff --git a/db/jukebox.mwb b/db/jukebox.mwb new file mode 100644 index 0000000..77777c2 Binary files /dev/null and b/db/jukebox.mwb differ diff --git a/db/script.sql b/db/script.sql new file mode 100644 index 0000000..f259650 --- /dev/null +++ b/db/script.sql @@ -0,0 +1,122 @@ +CREATE DATABASE IF NOT EXISTS jukebox CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE jukebox; + +DROP TABLE IF EXISTS track_genre; +DROP TABLE IF EXISTS artist_track; +DROP TABLE IF EXISTS likes; +DROP TABLE IF EXISTS tracks; +DROP TABLE IF EXISTS artists; +DROP TABLE IF EXISTS albums; +DROP TABLE IF EXISTS genres; +DROP TABLE IF EXISTS users; +DROP TABLE IF EXISTS roles; +DROP TABLE IF EXISTS labels; + +CREATE TABLE roles ( + id INT AUTO_INCREMENT PRIMARY KEY, + name ENUM('admin', 'user') NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE labels ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE genres ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + email VARCHAR(100) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + role_id INT NOT NULL, + CONSTRAINT fk_users_role + FOREIGN KEY (role_id) REFERENCES roles(id) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB; + +CREATE TABLE albums ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + cover_path VARCHAR(255), + release_date DATETIME, + duration_seconds INT, + type ENUM('single', 'ep', 'lp', 'album', 'compilation') NOT NULL DEFAULT 'album', + label_id INT, + CONSTRAINT fk_albums_label + FOREIGN KEY (label_id) REFERENCES labels(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE artists ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + cover_path VARCHAR(255), + release_date DATETIME, + label_id INT, + duration INT, + CONSTRAINT fk_artists_label + FOREIGN KEY (label_id) REFERENCES labels(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE tracks ( + id INT AUTO_INCREMENT PRIMARY KEY, + file_path VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + duration_seconds INT NOT NULL, + album_id INT, + CONSTRAINT fk_tracks_album + FOREIGN KEY (album_id) REFERENCES albums(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE likes ( + user_id INT NOT NULL, + track_id INT NOT NULL, + PRIMARY KEY (user_id, track_id), + CONSTRAINT fk_likes_user + FOREIGN KEY (user_id) REFERENCES users(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_likes_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE artist_track ( + artist_id INT NOT NULL, + track_id INT NOT NULL, + PRIMARY KEY (artist_id, track_id), + CONSTRAINT fk_artist_track_artist + FOREIGN KEY (artist_id) REFERENCES artists(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_artist_track_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE track_genre ( + track_id INT NOT NULL, + genre_id INT NOT NULL, + PRIMARY KEY (track_id, genre_id), + CONSTRAINT fk_track_genre_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_track_genre_genre + FOREIGN KEY (genre_id) REFERENCES genres(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB;