RelationalDesign: ddl.sql

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