RelationalDesign: ddl-v2.sql

File ddl-v2.sql, 4.8 KB (added by 231136, 8 days ago)
Line 
1drop schema if exists project cascade;
2
3create schema project;
4
5SET search_path TO project;
6
7DROP TABLE IF EXISTS ARTIST_CONTRIBUTIONS;
8DROP TABLE IF EXISTS PLAYLIST_SONGS;
9DROP TABLE IF EXISTS SAVED_PLAYLISTS;
10DROP TABLE IF EXISTS REVIEWS;
11DROP TABLE IF EXISTS LISTENS;
12DROP TABLE IF EXISTS LIKES;
13DROP TABLE IF EXISTS PERFORMS_AT;
14DROP TABLE IF EXISTS FOLLOWS;
15DROP TABLE IF EXISTS PLAYLISTS;
16DROP TABLE IF EXISTS EVENTS;
17DROP TABLE IF EXISTS SONGS;
18DROP TABLE IF EXISTS ALBUMS;
19DROP TABLE IF EXISTS MUSICAL_ENTITIES;
20DROP TABLE IF EXISTS ARTISTS;
21DROP TABLE IF EXISTS LISTENERS;
22DROP TABLE IF EXISTS ADMINS;
23DROP TABLE IF EXISTS NON_ADMIN_USERS;
24DROP TABLE IF EXISTS USERS;
25
26
27CREATE TABLE USERS (
28 user_id BIGINT PRIMARY KEY,
29 full_name TEXT NOT NULL,
30 email TEXT NOT NULL,
31 password TEXT NOT NULL,
32 username TEXT NOT NULL,
33 profile_photo TEXT
34);
35
36CREATE TABLE NON_ADMIN_USERS (
37 user_id BIGINT PRIMARY KEY REFERENCES USERS(user_id) ON DELETE CASCADE
38);
39
40CREATE TABLE ADMINS (
41 user_id BIGINT PRIMARY KEY REFERENCES USERS(user_id) ON DELETE CASCADE
42);
43
44CREATE TABLE LISTENERS (
45 user_id BIGINT PRIMARY KEY REFERENCES NON_ADMIN_USERS(user_id) ON DELETE CASCADE
46);
47
48CREATE TABLE ARTISTS (
49 user_id BIGINT PRIMARY KEY REFERENCES NON_ADMIN_USERS(user_id) ON DELETE CASCADE
50);
51
52CREATE TABLE MUSICAL_ENTITIES (
53 id BIGINT PRIMARY KEY,
54 title TEXT NOT NULL,
55 genre TEXT NOT NULL,
56 release_date DATE NOT NULL,
57 released_by BIGINT REFERENCES ARTISTS(user_id) ON DELETE CASCADE
58);
59
60
61CREATE TABLE ALBUMS (
62 id BIGINT PRIMARY KEY REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE
63);
64
65CREATE TABLE SONGS (
66 id BIGINT PRIMARY KEY REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE,
67 album_id BIGINT REFERENCES ALBUMS(id) ON DELETE CASCADE,
68-- modified_by_admin_id BIGINT REFERENCES ADMIN(user_id) ON DELETE SET NULL,
69-- removed_by_admin_id BIGINT REFERENCES ADMIN(user_id) ON DELETE SET NULL,
70 link TEXT NOT NULL
71);
72
73
74CREATE TABLE EVENTS (
75 event_id BIGINT PRIMARY KEY,
76 name TEXT NOT NULL,
77 location TEXT NOT NULL,
78 venue TEXT NOT NULL,
79 date DATE NOT NULL,
80 time TIME NOT NULL,
81 creator_artist_id BIGINT REFERENCES ARTISTS(user_id) ON DELETE CASCADE,
82 creator_admin_id BIGINT REFERENCES ADMINS (user_id) ON DELETE CASCADE,
83
84 CONSTRAINT has_exactly_one_creator
85 CHECK ((creator_artist_id is not null and creator_admin_id is null) OR
86 (creator_artist_id is null and creator_admin_id is not null))
87);
88
89CREATE TABLE PLAYLISTS (
90 playlist_id BIGINT PRIMARY KEY,
91 cover TEXT,
92 name TEXT NOT NULL,
93 created_by BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE
94);
95
96-- RELACII
97
98
99CREATE TABLE FOLLOWS (
100 follower BIGINT REFERENCES NON_ADMIN_USERS(user_id) ON DELETE CASCADE,
101 followee BIGINT REFERENCES NON_ADMIN_USERS(user_id) ON DELETE CASCADE,
102
103 CONSTRAINT follows_no_self_follow
104 CHECK (follower <> followee),
105
106 CONSTRAINT follows_pk
107 PRIMARY KEY (follower, followee)
108);
109
110CREATE TABLE PERFORMS_AT (
111 event_id BIGINT REFERENCES EVENTS(event_id) ON DELETE CASCADE,
112 artist_id BIGINT REFERENCES ARTISTS(user_id) ON DELETE CASCADE,
113
114 CONSTRAINT performs_at_pk
115 PRIMARY KEY (event_id, artist_id)
116);
117
118CREATE TABLE LIKES (
119 listener_id BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE,
120 musical_entity_id BIGINT REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE,
121
122 CONSTRAINT likes_pk
123 PRIMARY KEY (listener_id, musical_entity_id)
124);
125
126CREATE TABLE LISTENS (
127 listener_id BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE,
128 song_id BIGINT REFERENCES SONGS(id) ON DELETE CASCADE,
129 timestamp TIMESTAMP NOT NULL,
130
131 CONSTRAINT listens_to_pk
132 PRIMARY KEY (listener_id, song_id, timestamp)
133);
134
135CREATE TABLE REVIEWS (
136 listener_id BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE,
137 musical_entity_id BIGINT REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE,
138 grade INT CHECK ( grade between 1 and 5) NOT NULL,
139 comment TEXT,
140
141 CONSTRAINT reviews_pk
142 PRIMARY KEY (listener_id, musical_entity_id)
143);
144
145CREATE TABLE SAVED_PLAYLISTS (
146 listener_id BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE,
147 playlist_id BIGINT REFERENCES PLAYLISTS(playlist_id) ON DELETE CASCADE,
148
149 CONSTRAINT saved_playlists_id
150 PRIMARY KEY (listener_id, playlist_id)
151);
152
153CREATE TABLE PLAYLIST_SONGS (
154 song_id BIGINT REFERENCES SONGS(id) ON DELETE CASCADE,
155 playlist_id BIGINT REFERENCES PLAYLISTS(playlist_id) ON DELETE CASCADE,
156
157 CONSTRAINT playlist_songs_id
158 PRIMARY KEY (song_id, playlist_id)
159);
160
161CREATE TABLE ARTIST_CONTRIBUTIONS (
162 artist_id BIGINT REFERENCES ARTISTS(user_id) ON DELETE CASCADE,
163 musical_entity_id BIGINT REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE,
164 role TEXT NOT NULL,
165
166 CONSTRAINT artist_contribution_id
167 PRIMARY KEY (artist_id, musical_entity_id)
168);