From 54e2168a5cc4cc7808a0983e311d6ea537b31651 Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Thu, 23 Oct 2025 20:12:59 +0300 Subject: [PATCH 1/7] conceptional and logical diagrams, db script --- .../linkedin-conceptional-model.drawio | 405 ++++++++++++++++++ course-work/Implementations/linkedin-db.sql | 180 ++++++++ .../linkedin-logical-model.drawio | 324 ++++++++++++++ 3 files changed, 909 insertions(+) create mode 100644 course-work/Implementations/linkedin-conceptional-model.drawio create mode 100644 course-work/Implementations/linkedin-db.sql create mode 100644 course-work/Implementations/linkedin-logical-model.drawio diff --git a/course-work/Implementations/linkedin-conceptional-model.drawio b/course-work/Implementations/linkedin-conceptional-model.drawio new file mode 100644 index 0000000..b8bfa53 --- /dev/null +++ b/course-work/Implementations/linkedin-conceptional-model.drawio @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/course-work/Implementations/linkedin-db.sql b/course-work/Implementations/linkedin-db.sql new file mode 100644 index 0000000..5963043 --- /dev/null +++ b/course-work/Implementations/linkedin-db.sql @@ -0,0 +1,180 @@ +CREATE DATABASE linkedin; + +USE linkedin; + +-- :TODO Create 2 stored procedures, functions and triggers + +CREATE TABLE USER ( + UserID INT AUTO_INCREMENT PRIMARY KEY, + Name VARCHAR(100) NOT NULL, + Email VARCHAR(150) NOT NULL UNIQUE, + Headline VARCHAR(255), + Location VARCHAR(100), + Summary TEXT, + CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UpdatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +CREATE TABLE COMPANY ( + CompanyID INT AUTO_INCREMENT PRIMARY KEY, + CompanyName VARCHAR(200) NOT NULL, + Website VARCHAR(255), + Industry VARCHAR(100), + Size VARCHAR(50), + CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE POST ( + PostID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + Content TEXT NOT NULL, + CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UpdatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (UserID) REFERENCES USER(UserID) +); + +CREATE TABLE JOB_POSTING ( + JobID INT AUTO_INCREMENT PRIMARY KEY, + CompanyID INT NOT NULL, + Title VARCHAR(200) NOT NULL, + Description TEXT, + Location VARCHAR(100), + Requirements TEXT, + PostedDate DATE, + ExpiryDate DATE, + FOREIGN KEY (CompanyID) REFERENCES COMPANY(CompanyID) +); + +CREATE TABLE MESSAGE ( + MessageID INT AUTO_INCREMENT PRIMARY KEY, + SenderID INT NOT NULL, + ReceiverID INT NOT NULL, + Content TEXT, + Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (SenderID) REFERENCES USER(UserID), + FOREIGN KEY (ReceiverID) REFERENCES USER(UserID) +); + +CREATE TABLE SKILL ( + SkillID INT AUTO_INCREMENT PRIMARY KEY, + SkillName VARCHAR(100) NOT NULL +); + +CREATE TABLE EDUCATION ( + EducationID INT AUTO_INCREMENT PRIMARY KEY, + Degree VARCHAR(100), + InstitutionName VARCHAR(200), + StartDate DATE, + EndDate DATE, + Grade VARCHAR(50) +); + + +CREATE TABLE USER_COMMENT ( + UserCommentID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + PostID INT NOT NULL, + Content TEXT, + Likes INT, + FOREIGN KEY (PostID) REFERENCES POST(PostID) +); + + +CREATE TABLE WORK_EXPERIENCE ( + ExperienceID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + CompanyID INT NOT NULL, + JobTitle VARCHAR(150), + StartDate DATE, + EndDate DATE, + Description TEXT, + IsCurrent BOOLEAN DEFAULT FALSE, + FOREIGN KEY (UserID) REFERENCES USER(UserID), + FOREIGN KEY (CompanyID) REFERENCES COMPANY(CompanyID) +); + +CREATE TABLE USER_SKILL ( + UserSkillID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + SkillID INT NOT NULL, + EndorsementCount INT DEFAULT 0, + FOREIGN KEY (UserID) REFERENCES USER(UserID), + FOREIGN KEY (SkillID) REFERENCES SKILL(SkillID) +); + +CREATE TABLE USER_EDUCATION ( + UserEducationID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + EducationID INT NOT NULL, + StartDate DATE, + EndDate DATE, + Grade VARCHAR(20), + FOREIGN KEY (UserID) REFERENCES USER(UserID), + FOREIGN KEY (EducationID) REFERENCES EDUCATION(EducationID) +); + + +CREATE TABLE POST_REACTION ( + ReactionID INT AUTO_INCREMENT PRIMARY KEY, + UserID INT NOT NULL, + PostID INT NOT NULL, + ReactionType ENUM('like', 'celebrate', 'love', 'insightful', 'curious'), + CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (UserID) REFERENCES USER(UserID), + FOREIGN KEY (PostID) REFERENCES POST(PostID) +); + + +INSERT INTO USER (Name, Email, Headline, Location, Summary) VALUES +('Ivan Petrov', 'ivan.petrov@example.com', 'Senior Software Engineer', 'Sofia, Bulgaria', 'Experienced full-stack developer specializing in cloud solutions.'), +('Maria Dimitrova', 'maria.dimitrova@example.com', 'Product Manager', 'Plovdiv, Bulgaria', 'Leading cross-functional teams to deliver SaaS products.'); + +INSERT INTO COMPANY (CompanyName, Website, Industry, Size) VALUES +('Cognify Labs Ltd', 'https://cognifylabs.com', 'Information Technology', '50-200'), +('TechBridge Solutions', 'https://techbridgesolutions.com', 'Financial Services', '100-500'); + +INSERT INTO SKILL (SkillName) VALUES +('AWS Certified Developer'), +('Project Management'), +('TypeScript'), +('React'); + +INSERT INTO EDUCATION (Degree, InstitutionName, StartDate, EndDate, Grade) VALUES +('MSc Computer Science', 'Plovdiv University', '2016-09-01', '2018-06-30', 'Excellent'), +('BA Business Administration', 'Sofia University', '2012-09-01', '2016-06-30', 'Good'); + +INSERT INTO USER_SKILL (UserID, SkillID, EndorsementCount) VALUES +(1, 1, 6), +(1, 3, 12), +(2, 2, 4), +(2, 4, 8); + +INSERT INTO USER_EDUCATION (UserID, EducationID, StartDate, EndDate, Grade) VALUES +(1, 1, '2016-09-01', '2018-06-30', 'Excellent'), +(2, 2, '2012-09-01', '2016-06-30', 'Good'); + +INSERT INTO POST (UserID, Content) VALUES +(1, 'Excited to join Cognify Labs and work on cloud-native projects!'), +(2, 'Thrilled to announce our new B2B platform release!'); + + +INSERT INTO MESSAGE (SenderID, ReceiverID, Content) VALUES +(1, 2, 'Welcome to the team, Maria!'), +(2, 1, 'Thanks, Ivan! Looking forward to working together.'); + +INSERT INTO WORK_EXPERIENCE (UserID, CompanyID, JobTitle, StartDate, EndDate, IsCurrent) VALUES +(1, 1, 'Senior Software Engineer', '2019-01-01', NULL, TRUE), +(2, 2, 'Product Manager', '2022-04-01', NULL, TRUE); + +INSERT INTO JOB_POSTING (CompanyID, Title, Description, Location, Requirements, PostedDate, ExpiryDate) VALUES +(1, 'Full-Stack Developer', 'Join us to build scalable web applications.', 'Remote', 'React, Node.js, AWS', '2025-10-01', '2025-12-31'), +(2, 'Data Analyst', 'Work with our fintech platform data sets.', 'Plovdiv', 'SQL, Python, Excel', '2025-09-15', '2025-11-30'); + +INSERT INTO POST_REACTION (UserID, PostID, ReactionType) VALUES +(2, 1, 'celebrate'), +(1, 2, 'insightful'); + +INSERT INTO USER_COMMENT (UserID, PostID, Content, Likes) VALUES +(1, 2, "Great product!Will try it myself.", 3), +(2, 1, "Congrats on your new role!!!", 1); + diff --git a/course-work/Implementations/linkedin-logical-model.drawio b/course-work/Implementations/linkedin-logical-model.drawio new file mode 100644 index 0000000..4dcaf5e --- /dev/null +++ b/course-work/Implementations/linkedin-logical-model.drawio @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4649420cbfc56809c8e0a29a28371486003c3bb2 Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Thu, 23 Oct 2025 21:17:26 +0300 Subject: [PATCH 2/7] create a db stored procedure and a function --- course-work/Implementations/functions.sql | 14 +++++++++ course-work/Implementations/linkedin-db.sql | 4 ++- .../Implementations/stored-procedures.sql | 30 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 course-work/Implementations/functions.sql create mode 100644 course-work/Implementations/stored-procedures.sql diff --git a/course-work/Implementations/functions.sql b/course-work/Implementations/functions.sql new file mode 100644 index 0000000..a5f1e49 --- /dev/null +++ b/course-work/Implementations/functions.sql @@ -0,0 +1,14 @@ +DELIMITER // + +CREATE FUNCTION GetMostLikedComment() +RETURNS TEXT +DETERMINISTIC +READS SQL DATA +BEGIN + DECLARE most_liked_comment INT; + + RETURN (SELECT Content FROM USER_COMMENT ORDER BY Likes LIMIT 1); +END // + +-- Usage example +-- SELECT GetMostLikedComment() as 'Most liked comment'; \ No newline at end of file diff --git a/course-work/Implementations/linkedin-db.sql b/course-work/Implementations/linkedin-db.sql index 5963043..52b83a9 100644 --- a/course-work/Implementations/linkedin-db.sql +++ b/course-work/Implementations/linkedin-db.sql @@ -1,4 +1,6 @@ -CREATE DATABASE linkedin; +DROP DATABASE IF EXISTS linkedin; + +CREATE DATABASE IF NOT EXISTS linkedin; USE linkedin; diff --git a/course-work/Implementations/stored-procedures.sql b/course-work/Implementations/stored-procedures.sql new file mode 100644 index 0000000..525e51f --- /dev/null +++ b/course-work/Implementations/stored-procedures.sql @@ -0,0 +1,30 @@ +DELIMITER // + +CREATE PROCEDURE GetUserProfileSummary(IN p_UserID INT) +BEGIN + SELECT UserID, Name, Email, Headline, Location, Summary + FROM USER + WHERE UserID = p_UserID; + + -- TotalPosts + SELECT COUNT(*) AS TotalPosts + FROM POST + WHERE UserID = p_UserID; + + -- Skills + SELECT s.SkillName, us.EndorsementCount + FROM USER_SKILL us + JOIN SKILL s ON us.SkillID = s.SkillID + WHERE us.UserID = p_UserID + ORDER BY us.EndorsementCount DESC; + + -- Work experience + SELECT c.CompanyName, we.JobTitle, we.StartDate, we.EndDate, we.IsCurrent + FROM WORK_EXPERIENCE we + JOIN COMPANY c ON we.CompanyID = c.CompanyID + WHERE we.UserID = p_UserID + ORDER BY we.StartDate DESC; +END // + +-- Usage example: +-- CALL GetUserProfileSummary(1); From 9554870f0c152345d98b4d6cbe072511ab8f680e Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Thu, 23 Oct 2025 21:37:07 +0300 Subject: [PATCH 3/7] notification message db trigger --- course-work/Implementations/triggers.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 course-work/Implementations/triggers.sql diff --git a/course-work/Implementations/triggers.sql b/course-work/Implementations/triggers.sql new file mode 100644 index 0000000..233c547 --- /dev/null +++ b/course-work/Implementations/triggers.sql @@ -0,0 +1,11 @@ +DELIMITER // + +CREATE TRIGGER SendNotificationMessageToThePostCreator +BEFORE INSERT ON USER_COMMENT +FOR EACH ROW +BEGIN + SET @PostCreatorID = (SELECT UserID FROM POST WHERE PostID = NEW.PostID); + SET @CommentContent = NEW.Content; + + INSERT INTO MESSAGE (SenderID, ReceiverID, Content) VALUES (@PostCreatorID, @PostCreatorID, @CommentContent); +END // From b8b1a56cda6cd6550f20951d1a84b713fb2ab2c7 Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Fri, 24 Oct 2025 19:27:56 +0300 Subject: [PATCH 4/7] README, visualizations screenshot --- course-work/Implementations/README.md | 6 ++++++ .../visualizations-screenshot.png | Bin 0 -> 64578 bytes 2 files changed, 6 insertions(+) create mode 100644 course-work/Implementations/README.md create mode 100644 course-work/Implementations/visualizations-screenshot.png diff --git a/course-work/Implementations/README.md b/course-work/Implementations/README.md new file mode 100644 index 0000000..69fe8b3 --- /dev/null +++ b/course-work/Implementations/README.md @@ -0,0 +1,6 @@ +Фак. номер: 1901322039 +Име: Таньо Николов + +Проектът е за социалната мрежа LinkedIn + +Линк към Google Looker Studio (визуализации): https://lookerstudio.google.com/u/1/reporting/d6c9d2a7-3204-4297-8b81-b75feb668f5d/page/vFycF \ No newline at end of file diff --git a/course-work/Implementations/visualizations-screenshot.png b/course-work/Implementations/visualizations-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0d842a986507cbdd2431fa840537c7a77f82fe96 GIT binary patch literal 64578 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.PKY0$7deElr$Sm8Iuyl}j!66RDb@ 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 fX2$>PtJ(GsrkQ@7Pta0127K Date: Fri, 24 Oct 2025 19:46:00 +0300 Subject: [PATCH 5/7] additional trigger, function and stored procedure --- course-work/Implementations/functions.sql | 10 ++++++++++ course-work/Implementations/linkedin-db.sql | 2 -- course-work/Implementations/stored-procedures.sql | 9 +++++++++ course-work/Implementations/triggers.sql | 10 ++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/course-work/Implementations/functions.sql b/course-work/Implementations/functions.sql index a5f1e49..f832607 100644 --- a/course-work/Implementations/functions.sql +++ b/course-work/Implementations/functions.sql @@ -10,5 +10,15 @@ BEGIN RETURN (SELECT Content FROM USER_COMMENT ORDER BY Likes LIMIT 1); END // +CREATE FUNCTION PostsCount() +RETURNS INT +DETERMINISTIC +READS SQL DATA +BEGIN + DECLARE most_liked_comment INT; + + RETURN (SELECT COUNT(*) FROM POST); +END // + -- Usage example -- SELECT GetMostLikedComment() as 'Most liked comment'; \ No newline at end of file diff --git a/course-work/Implementations/linkedin-db.sql b/course-work/Implementations/linkedin-db.sql index 52b83a9..fac94dc 100644 --- a/course-work/Implementations/linkedin-db.sql +++ b/course-work/Implementations/linkedin-db.sql @@ -4,8 +4,6 @@ CREATE DATABASE IF NOT EXISTS linkedin; USE linkedin; --- :TODO Create 2 stored procedures, functions and triggers - CREATE TABLE USER ( UserID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100) NOT NULL, diff --git a/course-work/Implementations/stored-procedures.sql b/course-work/Implementations/stored-procedures.sql index 525e51f..f708d18 100644 --- a/course-work/Implementations/stored-procedures.sql +++ b/course-work/Implementations/stored-procedures.sql @@ -26,5 +26,14 @@ BEGIN ORDER BY we.StartDate DESC; END // +CREATE PROCEDURE MostUsedSkills() +BEGIN + SELECT s.SkillName, COUNT(u.UserID) + FROM USER_SKILL us + JOIN USER u ON us.UserID = u.UserID + JOIN SKILL s ON us.SkillID = s.SkillID + GROUP BY s.SkillName; +END // + -- Usage example: -- CALL GetUserProfileSummary(1); diff --git a/course-work/Implementations/triggers.sql b/course-work/Implementations/triggers.sql index 233c547..1b39396 100644 --- a/course-work/Implementations/triggers.sql +++ b/course-work/Implementations/triggers.sql @@ -9,3 +9,13 @@ BEGIN INSERT INTO MESSAGE (SenderID, ReceiverID, Content) VALUES (@PostCreatorID, @PostCreatorID, @CommentContent); END // + +CREATE TRIGGER SendReactionNotification +BEFORE INSERT ON POST_REACTION +FOR EACH ROW +BEGIN + SET @PostCreatorID = (SELECT UserID FROM POST WHERE PostID = NEW.PostID); + SET @ReactionType = NEW.ReactionType; + + INSERT INTO MESSAGE (SenderID, ReceiverID, Content) VALUES (@PostCreatorID, @PostCreatorID, @ReactionType); +END // From 707addc7c28da18812f88ef5e575fb4f25a172b8 Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Fri, 24 Oct 2025 20:48:55 +0300 Subject: [PATCH 6/7] add physical db diagram --- .../linkedin-logical-model.drawio | 4325 ++++++++++++++++- .../linkedin-physical-model.drawio | 324 ++ 2 files changed, 4454 insertions(+), 195 deletions(-) create mode 100644 course-work/Implementations/linkedin-physical-model.drawio diff --git a/course-work/Implementations/linkedin-logical-model.drawio b/course-work/Implementations/linkedin-logical-model.drawio index 4dcaf5e..04058f5 100644 --- a/course-work/Implementations/linkedin-logical-model.drawio +++ b/course-work/Implementations/linkedin-logical-model.drawio @@ -1,321 +1,4256 @@ - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + - - + + - - + + - - + + - + - + - + - + - + - - - - - + + - + - + - + - + - + - + - + - - + + + + + + + + + + + - + + + + + + + - + - + - + - + - + - - + + + + + + + + + + + + + + - - + + + + + + + - - + + + + - - + + + + + - + - + - + - - + + - - + + + + + + + + + + + + + + + - - + + - - + + - - + + + + + + + + + + + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + + + + + + + + + + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + + + + + + + + + + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + + + + + + + + + + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - + + - - + + + + + + + - - + + - - - - - - - - - - - - - + + - - + + + + + + + - - + + - - + + + + + + + + + + + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/course-work/Implementations/linkedin-physical-model.drawio b/course-work/Implementations/linkedin-physical-model.drawio new file mode 100644 index 0000000..4dcaf5e --- /dev/null +++ b/course-work/Implementations/linkedin-physical-model.drawio @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cc473f3a3a902b1fac0cdcfd278a25506a537739 Mon Sep 17 00:00:00 2001 From: Tanyo Nikolov Date: Sat, 25 Oct 2025 09:24:26 +0300 Subject: [PATCH 7/7] remove unused variable --- course-work/Implementations/functions.sql | 2 -- 1 file changed, 2 deletions(-) diff --git a/course-work/Implementations/functions.sql b/course-work/Implementations/functions.sql index f832607..5d3f4a7 100644 --- a/course-work/Implementations/functions.sql +++ b/course-work/Implementations/functions.sql @@ -15,8 +15,6 @@ RETURNS INT DETERMINISTIC READS SQL DATA BEGIN - DECLARE most_liked_comment INT; - RETURN (SELECT COUNT(*) FROM POST); END //