Skip to content

Commit feb3e85

Browse files
authored
Add files via upload
1 parent 4143e1c commit feb3e85

5 files changed

+525
-0
lines changed

Project Evaluation.pdf

31.2 KB
Binary file not shown.
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
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

Comments
 (0)