|
| 1 | +/* This is a script for creating the Library database, its tables and views, and for populating them with data */ |
| 2 | + |
| 3 | +# Drop the database and tables, if they exist |
| 4 | + |
| 5 | +################################################################################## |
| 6 | +############################# CREATING THE DATABASE ############################## |
| 7 | +################################################################################## |
| 8 | + |
| 9 | +DROP DATABASE IF EXISTS Library; |
| 10 | +CREATE DATABASE Library; |
| 11 | +USE Library; |
| 12 | + |
| 13 | +################################################################################## |
| 14 | +############################## CREATING THE TABLES ############################### |
| 15 | +############################## FOR THE ENTITY SETS ############################### |
| 16 | +################################################################################## |
| 17 | + |
| 18 | + |
| 19 | +# Here, we will first create the tables for all the necessary Entity Sets: |
| 20 | + |
| 21 | +CREATE TABLE LibraryUser ( |
| 22 | + UserID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 23 | + FirstName VARCHAR(255) NOT NULL, |
| 24 | + LastName VARCHAR(255) NOT NULL, |
| 25 | + BirthDate DATE NOT NULL, |
| 26 | + LoanerNumber VARCHAR(6) NOT NULL UNIQUE, |
| 27 | + UserStatus ENUM('ACTIVE', 'TERMINATED', 'BLOCKED') NOT NULL, # Can be ACTIVE, TERMINATED, or BLOCKED |
| 28 | + |
| 29 | + PRIMARY KEY(UserID) |
| 30 | +); |
| 31 | + |
| 32 | +CREATE TABLE Author ( |
| 33 | + AuthorID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 34 | + FirstName VARCHAR(255) NOT NULL, |
| 35 | + LastName VARCHAR(255) NOT NULL, |
| 36 | + Nationality VARCHAR(255), |
| 37 | + |
| 38 | + PRIMARY KEY(AuthorID) |
| 39 | +); |
| 40 | + |
| 41 | +CREATE TABLE Genre ( |
| 42 | + GenreID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 43 | + GenreType VARCHAR(255) NOT NULL, |
| 44 | + GenreSubtype VARCHAR(255) NOT NULL, |
| 45 | + |
| 46 | + PRIMARY KEY(GenreID) |
| 47 | +); |
| 48 | + |
| 49 | +CREATE TABLE Publisher ( |
| 50 | + PublisherID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 51 | + PublisherName VARCHAR(255) NOT NULL UNIQUE, |
| 52 | + HQCountry VARCHAR(255), |
| 53 | + |
| 54 | + PRIMARY KEY(PublisherID) |
| 55 | +); |
| 56 | + |
| 57 | +CREATE TABLE Book ( |
| 58 | + BookID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 59 | + Title VARCHAR(255) NOT NULL, |
| 60 | + ReleaseYear YEAR, |
| 61 | + PageCount INTEGER, |
| 62 | + TotalQuantity INTEGER NOT NULL, |
| 63 | + TextLanguage VARCHAR(255), |
| 64 | + PublisherID INTEGER, |
| 65 | + GenreID INTEGER, |
| 66 | + |
| 67 | + PRIMARY KEY(BookID), |
| 68 | + FOREIGN KEY(PublisherID) REFERENCES Publisher(PublisherID) ON DELETE CASCADE, |
| 69 | + FOREIGN KEY(GenreID) REFERENCES Genre(GenreID) ON DELETE CASCADE |
| 70 | +); |
| 71 | + |
| 72 | +CREATE TABLE Fine ( |
| 73 | + FineID INTEGER NOT NULL UNIQUE AUTO_INCREMENT, |
| 74 | + Amount DECIMAL(8, 2) NOT NULL, |
| 75 | + UserID INTEGER NOT NULL, |
| 76 | + IssuedDate DATE NOT NULL, |
| 77 | + PaymentStatus ENUM('PAID', 'NOT PAID') NOT NULL, # Can be PAID or NOT PAID |
| 78 | + |
| 79 | + PRIMARY KEY(FineID), |
| 80 | + FOREIGN KEY(UserID) REFERENCES LibraryUser(UserID) ON DELETE CASCADE |
| 81 | +); |
| 82 | + |
| 83 | + |
| 84 | +################################################################################## |
| 85 | +############################## CREATING THE TABLES ############################### |
| 86 | +####################### FOR THE MANY-TO-MANY RELATIONSHIPS ####################### |
| 87 | +################################################################################## |
| 88 | + |
| 89 | + |
| 90 | +# Now, we will create the tables for all the necessary many-to-many Relationship Sets: |
| 91 | + |
| 92 | +CREATE TABLE Loans ( |
| 93 | + UserID INTEGER NOT NULL, |
| 94 | + BookID INTEGER NOT NULL, |
| 95 | + LoanedDate DATE NOT NULL, |
| 96 | + UntilDate DATE NOT NULL, # Must always be 30 days after the LoanedDate |
| 97 | + ReturnedDate DATE, |
| 98 | + LoanedStatus ENUM('LOANED', 'FINED', 'RETURNED') NOT NULL, # Can be LOANED, FINED, or RETURNED |
| 99 | + |
| 100 | + PRIMARY KEY(UserID, BookID, LoanedDate), |
| 101 | + FOREIGN KEY(UserID) REFERENCES LibraryUser(UserID) ON DELETE CASCADE, |
| 102 | + FOREIGN KEY(BookID) REFERENCES Book(BookID) ON DELETE CASCADE |
| 103 | +); |
| 104 | + |
| 105 | +CREATE TABLE Reserves ( |
| 106 | + UserID INTEGER NOT NULL, |
| 107 | + BookID INTEGER NOT NULL, |
| 108 | + ReservedDate DATE NOT NULL, |
| 109 | + ReservedStatus ENUM('RESERVED', 'CANCELLED', 'COMPLETED') NOT NULL, # Can be RESERVED, CANCELLED OR COMPLETED |
| 110 | + |
| 111 | + PRIMARY KEY(UserID, BookID, ReservedDate), |
| 112 | + FOREIGN KEY(UserID) REFERENCES LibraryUser(UserID) ON DELETE CASCADE, |
| 113 | + FOREIGN KEY(BookID) REFERENCES Book(BookID) ON DELETE CASCADE |
| 114 | +); |
| 115 | + |
| 116 | +CREATE TABLE Writes ( |
| 117 | + AuthorID INT NOT NULL, |
| 118 | + BookID INT NOT NULL, |
| 119 | + |
| 120 | + PRIMARY KEY(AuthorID, BookID), |
| 121 | + FOREIGN KEY(AuthorID) REFERENCES Author(AuthorID) ON DELETE CASCADE, |
| 122 | + FOREIGN KEY(BookID) REFERENCES Book(BookID) ON DELETE CASCADE |
| 123 | +); |
| 124 | + |
| 125 | + |
| 126 | +################################################################################## |
| 127 | +############################## CREATING THE VIEWS ############################### |
| 128 | +################################################################################## |
| 129 | + |
| 130 | +# Drop views, if they exist |
| 131 | +DROP VIEW IF EXISTS BookAuthorsView; |
| 132 | +DROP VIEW IF EXISTS TotalAmountDueView; |
| 133 | + |
| 134 | + |
| 135 | +# Create the necessary views |
| 136 | + |
| 137 | +CREATE VIEW BookAuthorsView AS |
| 138 | + SELECT B.BookId, B.Title, GROUP_CONCAT(CONCAT(A.FirstName, ' ', A.LastName) SEPARATOR ', ') AS Author |
| 139 | + FROM Book B |
| 140 | + NATURAL JOIN Writes W |
| 141 | + NATURAL JOIN Author A |
| 142 | + GROUP BY B.BookId; |
| 143 | + |
| 144 | + |
| 145 | +CREATE VIEW TotalAmountDueView AS |
| 146 | + SELECT U.UserId, CONCAT(U.FirstName, ' ', U.LastName) AS Name, SUM(F.Amount) AS Total |
| 147 | + FROM LibraryUser U |
| 148 | + NATURAL JOIN Fine F |
| 149 | + WHERE F.PaymentStatus = 'NOT PAID' |
| 150 | + GROUP BY U.UserId; |
| 151 | + |
| 152 | +##################################################################################### |
| 153 | +############################ POPULATING THE ENTITY SETS ############################# |
| 154 | +##################################################################################### |
| 155 | + |
| 156 | +INSERT LibraryUser (UserID, FirstName, LastName, BirthDate, LoanerNumber, UserStatus) VALUES |
| 157 | +(1, 'Sule', 'Altintas', '1995-08-30', '154399', 'ACTIVE'), # The jewel of the group, ermmm... I meant crown! |
| 158 | +(2, 'Fahad', 'Sajad', '1990-05-09', '160344', 'ACTIVE'), # Our kind second group member |
| 159 | +(3, 'Sebastian', 'Sbirna', '1997-05-04', '190553', 'ACTIVE'), # That's him alright |
| 160 | +(4, 'Kåre', 'Jørgensen', '1994-05-09', '144852', 'ACTIVE'), # Yup, our only Kåre |
| 161 | +(5, 'Mary', 'Little', '2013-05-07', '100115', 'ACTIVE'), # Mary Little is too little to read books suitable for a grown-up audience |
| 162 | +(6, 'Humphrey', 'Oldman', '1942-01-01', '997953', 'TERMINATED'), # Humphrey Oldman is so retired that he retired his library account as well :) |
| 163 | +(7, 'Billy', 'Bully', '2007-04-25', '203442', 'BLOCKED'); # Billy Bully didn't bring back his books :) |
| 164 | + |
| 165 | +INSERT Publisher (PublisherID, PublisherName, HQCountry) VALUES |
| 166 | +(1, 'Klim', 'Denmark'), |
| 167 | +(2, 'Samleren', 'Denmark'), |
| 168 | +(3, 'Lindhardt og Ringhof', 'Denmark'), |
| 169 | +(4, 'Gyldendal', 'Denmark'), |
| 170 | +(5, 'Textmaster', 'USA'), |
| 171 | +(6, 'McGraw-Hill', 'USA'), |
| 172 | +(7, 'Faber and Faber', 'United Kingdom'); |
| 173 | + |
| 174 | +# For inserting Genres into the database, we used the following website as source reference: |
| 175 | +# https://reference.yourdictionary.com/books-literature/different-types-of-books.html |
| 176 | +INSERT Genre (GenreID, GenreType, GenreSubtype) VALUES |
| 177 | +(1, 'Fiction', 'Romance'), |
| 178 | +(2, 'Fiction', 'Horror'), |
| 179 | +(3, 'Fiction', 'Thriller'), |
| 180 | +(4, 'Fiction', 'Science Fiction'), |
| 181 | +(5, 'Non-fiction', 'Guide'), |
| 182 | +(6, 'Non-fiction', 'Textbook'), |
| 183 | +(7, 'Fiction', 'Crime'), |
| 184 | +(8, 'Fiction', 'Fantasy'), |
| 185 | +(9, 'Non-fiction', 'Prayer'); |
| 186 | + |
| 187 | +INSERT Book (BookID, Title, ReleaseYear, PageCount, TotalQuantity, TextLanguage, PublisherID, GenreID) VALUES |
| 188 | +(1, 'Kafka på stranden', '2007', 505, 5, 'Danish', 1, 4), |
| 189 | +(2, '1Q84', '2011', 928, 4, 'Danish', 1, 1), |
| 190 | +(3, 'Rødby-Puttgarden', '2011', NULL, 1, 'Danish', 2, 3), |
| 191 | +(4, 'Maigret', '2017', 144, 10, 'Danish', 3, 7), |
| 192 | +(5, 'Windows 8.1 - Effektiv uden touch', '2014', 255, 1, 'Danish', 5, 5), |
| 193 | +(6, 'Database System Concepts, Sixth Edition', '2010', 1349, 5, 'English', 6, 6), |
| 194 | +(7, 'The New Tork Trilogy', '1985', 478, 2, 'English', 7, 7); |
| 195 | + |
| 196 | +INSERT Author (AuthorID, FirstName, LastName, Nationality) VALUES |
| 197 | +(1, 'Haruki', 'Murakami', 'Japan'), |
| 198 | +(2, 'Helle', 'Helle', 'Denmark'), |
| 199 | +(3, 'Ernest', 'Hemingsway', 'USA'), |
| 200 | +(4, 'Georges', 'Simenon', 'Belgium'), |
| 201 | +(5, 'Martin', 'Simon', 'Denmark'), |
| 202 | +(6, 'Avi', 'Silberschatz', 'USA'), |
| 203 | +(7, 'Henry', 'Korth', 'USA'), |
| 204 | +(8, 'S.', 'Sudarshan', 'USA'), |
| 205 | +(9, 'Paul', 'Auster', 'USA'); |
| 206 | + |
| 207 | +INSERT Fine (FineID, Amount, UserID, IssuedDate, PaymentStatus) VALUES |
| 208 | +(1, 100.00, 7, '2019-09-17', 'NOT PAID'), |
| 209 | +(2, 100.00, 7, '2019-10-20', 'NOT PAID'), |
| 210 | +(3, 100.00, 7, '2019-12-14', 'NOT PAID'); |
| 211 | + |
| 212 | +####################################################################################### |
| 213 | +############################ POPULATING THE RELATIONSHIPS ############################# |
| 214 | +####################################################################################### |
| 215 | + |
| 216 | +INSERT Loans (UserID, BookID, LoanedDate, UntilDate, ReturnedDate, LoanedStatus) VALUES |
| 217 | +(5, 4, '2019-01-05', TIMESTAMPADD(DAY, 30, '2019-01-05'), '2019-01-24', 'RETURNED'), |
| 218 | +(5, 3, '2019-01-17', TIMESTAMPADD(DAY, 30, '2019-01-17'), '2019-02-13', 'RETURNED'), |
| 219 | +(7, 4, '2019-08-17', TIMESTAMPADD(DAY, 30, '2019-08-17'), NULL, 'FINED'), |
| 220 | +(7, 7, '2019-09-20', TIMESTAMPADD(DAY, 30, '2019-09-20'), NULL, 'FINED'), |
| 221 | +(7, 2, '2019-11-14', TIMESTAMPADD(DAY, 30, '2019-11-14'), NULL, 'FINED'), |
| 222 | +(1, 6, '2020-03-29', TIMESTAMPADD(DAY, 30, '2020-03-29'), NULL, 'LOANED'), |
| 223 | +(2, 6, '2020-03-29', TIMESTAMPADD(DAY, 30, '2020-03-29'), NULL, 'LOANED'), |
| 224 | +(3, 6, '2020-03-29', TIMESTAMPADD(DAY, 30, '2020-03-29'), NULL, 'LOANED'), |
| 225 | +(4, 6, '2020-03-29', TIMESTAMPADD(DAY, 30, '2020-03-29'), NULL, 'LOANED'), |
| 226 | +(3, 5, '2020-03-12', TIMESTAMPADD(DAY, 30, '2020-03-12'), NULL, 'LOANED'); |
| 227 | + |
| 228 | +INSERT Reserves (UserID, BookID, ReservedDate, ReservedStatus) VALUES |
| 229 | +(2, 5, '2020-03-20', 'RESERVED'); |
| 230 | + |
| 231 | +INSERT Writes (AuthorID, BookID) VALUES |
| 232 | +(1, 1), |
| 233 | +(1, 2), |
| 234 | +(2, 3), |
| 235 | +(4, 4), |
| 236 | +(5, 5), |
| 237 | +(6, 6), |
| 238 | +(7, 6), |
| 239 | +(8, 6), |
| 240 | +(9, 7); |
| 241 | + |
| 242 | + |
| 243 | +######################################################################################### |
| 244 | +############################ SHOWING THE RELATION INSTANCES ############################# |
| 245 | +############################### USING SQL SELECT QUERIES ################################ |
| 246 | +######################################################################################### |
| 247 | + |
| 248 | +SELECT * FROM LibraryUser; |
| 249 | +SELECT * FROM Author; |
| 250 | +SELECT * FROM Genre; |
| 251 | +SELECT * FROM Publisher; |
| 252 | +SELECT * FROM Book; |
| 253 | +SELECT * FROM Fine; |
| 254 | + |
| 255 | +SELECT * FROM Loans; |
| 256 | +SELECT * FROM Reserves; |
| 257 | +SELECT * FROM Writes; |
| 258 | + |
| 259 | +SELECT * FROM BookAuthorsView; |
| 260 | +SELECT * FROM TotalAmountDueView; |
0 commit comments