<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: NatpuEnean VA</title>
    <description>The latest articles on Forem by NatpuEnean VA (@natpuenean_va_27a0f631f48).</description>
    <link>https://forem.com/natpuenean_va_27a0f631f48</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3450525%2F358d1ec5-e701-4170-b613-f245e0c1ca98.png</url>
      <title>Forem: NatpuEnean VA</title>
      <link>https://forem.com/natpuenean_va_27a0f631f48</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/natpuenean_va_27a0f631f48"/>
    <language>en</language>
    <item>
      <title>Neo4j – The Leading Open-Source Graph Database Every Developer Should Know</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Fri, 19 Dec 2025 08:40:53 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/neo4j-the-leading-open-source-graph-database-every-developer-should-know-2l2i</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/neo4j-the-leading-open-source-graph-database-every-developer-should-know-2l2i</guid>
      <description>&lt;p&gt;Modern applications generate data that is deeply connected—users, purchases, relationships, activities.&lt;br&gt;
Traditional relational databases struggle when the number of joins increases.&lt;/p&gt;

&lt;p&gt;Neo4j solves that problem elegantly.&lt;/p&gt;

&lt;p&gt;** What is Neo4j?&lt;br&gt;
**&lt;br&gt;
Neo4j is a popular open-source, NoSQL graph database built for storing and querying connected data.&lt;/p&gt;

&lt;p&gt;Instead of tables, rows, and columns, Neo4j uses:&lt;/p&gt;

&lt;p&gt;Nodes – entities/objects&lt;/p&gt;

&lt;p&gt;Relationships – links between nodes&lt;/p&gt;

&lt;p&gt;Properties – metadata that describes nodes &amp;amp; relationships&lt;/p&gt;

&lt;p&gt;This structure allows queries to traverse connected paths extremely efficiently.&lt;/p&gt;

&lt;p&gt;Why developers love Neo4j&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neo4j provides:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast relationship traversal&lt;/p&gt;

&lt;p&gt;Simple and expressive query language (Cypher)&lt;/p&gt;

&lt;p&gt;ACID-compliant transactions&lt;/p&gt;

&lt;p&gt;Native graph storage engine&lt;/p&gt;

&lt;p&gt;Strong community + active ecosystem&lt;/p&gt;

&lt;p&gt;You don’t need complex joins – relationships are first-class citizens.&lt;/p&gt;

&lt;p&gt;Use cases for Neo4j&lt;/p&gt;

&lt;p&gt;Neo4j shines when data is highly connected:&lt;/p&gt;

&lt;p&gt;Social networks&lt;/p&gt;

&lt;p&gt;Knowledge graphs&lt;/p&gt;

&lt;p&gt;Fraud detection patterns&lt;/p&gt;

&lt;p&gt;Recommendation engines&lt;/p&gt;

&lt;p&gt;Identity + access management&lt;/p&gt;

&lt;p&gt;Network + IT dependency mapping&lt;/p&gt;

&lt;p&gt;Any domain where relationships matter → Neo4j becomes powerful.&lt;/p&gt;

&lt;p&gt;Install &amp;amp; Set Up Neo4j (Developer Steps)&lt;/p&gt;

&lt;p&gt;Download Neo4j Community Edition&lt;br&gt;
 Start local DB instance&lt;br&gt;
 Open Neo4j Browser at localhost:7474&lt;br&gt;
 Authenticate + begin modeling your graph&lt;/p&gt;

&lt;p&gt;Example: Creating and Querying Nodes with Cypher&lt;/p&gt;

&lt;p&gt;Create two users:&lt;/p&gt;

&lt;p&gt;CREATE (u1:User {name:'Alice'}),&lt;br&gt;
       (u2:User {name:'Bob'});&lt;/p&gt;

&lt;p&gt;Create a relationship:&lt;/p&gt;

&lt;p&gt;MATCH (u1:User {name:'Alice'}), (u2:User {name:'Bob'})&lt;br&gt;
CREATE (u1)-[:FOLLOWS]-&amp;gt;(u2);&lt;/p&gt;

&lt;p&gt;Query connections:&lt;/p&gt;

&lt;p&gt;MATCH (u:User)-[:FOLLOWS]-&amp;gt;(friend)&lt;br&gt;
RETURN u.name, friend.name;&lt;/p&gt;

&lt;p&gt;That's a 3-line traversal that would take multiple JOINs in SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Choose Neo4j Instead of SQL for Connected Data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQL works great for structured, transactional use cases.&lt;br&gt;
But when queries require:&lt;/p&gt;

&lt;p&gt;Many levels of relationships&lt;/p&gt;

&lt;p&gt;Pattern matching&lt;/p&gt;

&lt;p&gt;Path finding&lt;/p&gt;

&lt;p&gt;Graph models outperform relational systems.&lt;/p&gt;

&lt;p&gt;Neo4j makes these queries natural and scalable.&lt;/p&gt;

&lt;p&gt;Open-Source Advantages&lt;/p&gt;

&lt;p&gt;Neo4j’s open-source nature means:&lt;/p&gt;

&lt;p&gt;Transparent development&lt;/p&gt;

&lt;p&gt;Active community support&lt;/p&gt;

&lt;p&gt;Free to get started&lt;/p&gt;

&lt;p&gt;Tons of extensions + integrations&lt;/p&gt;

&lt;p&gt;Neo4j integrates easily with:&lt;/p&gt;

&lt;p&gt;Python, JavaScript, Java, Go, etc.&lt;/p&gt;

&lt;p&gt;Spring Boot&lt;/p&gt;

&lt;p&gt;GraphQL&lt;/p&gt;

&lt;p&gt;Apache Kafka&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Neo4j is a powerful tool for developers building graph-driven applications.&lt;/p&gt;

&lt;p&gt;Whether you’re developing:&lt;/p&gt;

&lt;p&gt;social platforms,&lt;/p&gt;

&lt;p&gt;recommendation engines, or&lt;/p&gt;

&lt;p&gt;fraud-detection systems,&lt;/p&gt;

&lt;p&gt;Neo4j provides the modeling flexibility and performance needed for connected data at scale.&lt;/p&gt;

&lt;p&gt;If you've never worked with graph databases, Neo4j is the deepest and easiest open-source entry point to begin your journey &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Getting Started With Amazon Neptune – A Graph Database for Modern Apps</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Fri, 19 Dec 2025 08:38:11 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/getting-started-with-amazon-neptune-a-graph-database-for-modern-apps-5f3a</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/getting-started-with-amazon-neptune-a-graph-database-for-modern-apps-5f3a</guid>
      <description>&lt;p&gt;When building modern applications, one challenge developers face is modeling complex relationships between data. Traditional relational databases struggle when relationships become deeply connected.&lt;/p&gt;

&lt;p&gt;This is where Amazon Neptune comes in.&lt;/p&gt;

&lt;p&gt;What is Amazon Neptune?&lt;/p&gt;

&lt;p&gt;Amazon Neptune is a fully managed graph database service by AWS designed to store and query highly connected datasets.&lt;/p&gt;

&lt;p&gt;Instead of storing tables and joins, Neptune stores nodes and edges, making relationship queries more natural and faster.&lt;/p&gt;

&lt;p&gt;It supports two major graph models:&lt;/p&gt;

&lt;p&gt;Property Graph using Apache TinkerPop Gremlin&lt;/p&gt;

&lt;p&gt;W3C RDF using SPARQL&lt;/p&gt;

&lt;p&gt;This lets developers choose an approach that suits their application.&lt;/p&gt;

&lt;p&gt;Why use Neptune instead of SQL?&lt;/p&gt;

&lt;p&gt;Neptune shines when:&lt;/p&gt;

&lt;p&gt;You need to find relationships quickly&lt;/p&gt;

&lt;p&gt;Your data constantly grows with new connections&lt;/p&gt;

&lt;p&gt;Queries require traversing multiple hops&lt;/p&gt;

&lt;p&gt;Example use cases:&lt;/p&gt;

&lt;p&gt;Social networks (followers → mutual friends → interests)&lt;/p&gt;

&lt;p&gt;Fraud detection (tracking suspicious transactions)&lt;/p&gt;

&lt;p&gt;Recommendation engines (users → purchases → products)&lt;/p&gt;

&lt;p&gt;Knowledge graphs (concepts → relationships)&lt;/p&gt;

&lt;p&gt;Doing these in SQL means expensive JOINs and slow performance. Neptune makes relationship queries efficient.&lt;/p&gt;

&lt;p&gt;How Neptune Works&lt;/p&gt;

&lt;p&gt;Neptune stores data using:&lt;/p&gt;

&lt;p&gt;Vertices (nodes) – represent objects&lt;/p&gt;

&lt;p&gt;Edges – represent relationships&lt;/p&gt;

&lt;p&gt;Properties – describe nodes and edges&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;User ── follows ──&amp;gt; User&lt;br&gt;
User ── purchased ──&amp;gt; Product&lt;br&gt;
Product ── belongsTo ──&amp;gt; Category&lt;/p&gt;

&lt;p&gt;You can then query patterns like:&lt;/p&gt;

&lt;p&gt;“Find all users who bought products in category X that their friends purchased.”&lt;/p&gt;

&lt;p&gt;Getting Started With Neptune&lt;/p&gt;

&lt;p&gt;Here's a simple workflow for developers:&lt;/p&gt;

&lt;p&gt;Create a Neptune DB Cluster&lt;/p&gt;

&lt;p&gt;Open AWS console&lt;/p&gt;

&lt;p&gt;Search for Amazon Neptune&lt;/p&gt;

&lt;p&gt;Choose instance type + VPC settings&lt;/p&gt;

&lt;p&gt;Connect using Gremlin or SPARQL&lt;/p&gt;

&lt;p&gt;Example Gremlin command to add a user vertex:&lt;/p&gt;

&lt;p&gt;g.addV("user").property("id","u1").property("name","Natpu")&lt;/p&gt;

&lt;p&gt;Add a relationship:&lt;/p&gt;

&lt;p&gt;g.V("u1").addE("follows").to(g.V("u2"))&lt;/p&gt;

&lt;p&gt;Query mutual connections:&lt;/p&gt;

&lt;p&gt;g.V("u1").out("follows").out("follows")&lt;/p&gt;

&lt;p&gt;That’s how easy traversals become.&lt;/p&gt;

&lt;p&gt;Security &amp;amp; Performance Benefits&lt;/p&gt;

&lt;p&gt;Neptune integrates with AWS services:&lt;/p&gt;

&lt;p&gt;VPC networking&lt;/p&gt;

&lt;p&gt;IAM authentication&lt;/p&gt;

&lt;p&gt;Encryption at rest + in transit&lt;/p&gt;

&lt;p&gt;Built-in backups + monitoring&lt;/p&gt;

&lt;p&gt;Millisecond latency on graph traversals&lt;/p&gt;

&lt;p&gt;You focus on queries instead of managing databases.&lt;/p&gt;

&lt;p&gt;When Should Developers Choose Neptune?&lt;/p&gt;

&lt;p&gt;Use Neptune if:&lt;/p&gt;

&lt;p&gt;✔ Your data is relationship-heavy&lt;br&gt;
✔ Query performance matters&lt;br&gt;
✔ JOINs are becoming too complex&lt;br&gt;
✔ You want fully managed infrastructure&lt;/p&gt;

&lt;p&gt;Avoid Neptune if:&lt;/p&gt;

&lt;p&gt;✖ Your dataset is simple&lt;br&gt;
✖ Relationships are shallow&lt;br&gt;
✖ A relational DB is sufficient&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Amazon Neptune opens powerful opportunities for developers building intelligent apps based on relationships.&lt;/p&gt;

&lt;p&gt;Whether you're working on social graphs, recommendation engines, or fraud detection, Neptune offers performance, ease of management, and flexibility in query languages.&lt;/p&gt;

&lt;p&gt;If you’re exploring graph databases for the first time, Neptune is a strong AWS-native option to start with.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>neptune</category>
    </item>
    <item>
      <title>Database Normalization in Oracle SQL — From 1NF to 3NF with Example</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Sun, 05 Oct 2025 11:00:52 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/database-normalization-in-oracle-sql-from-1nf-to-3nf-with-example-3m89</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/database-normalization-in-oracle-sql-from-1nf-to-3nf-with-example-3m89</guid>
      <description>&lt;p&gt;In this post, we will learn about 1NF, 2NF, and 3NF with SQL examples. We’ll start with a denormalized base table and gradually normalize it step by step.&lt;/p&gt;

&lt;p&gt;Anomalies in Base Table&lt;br&gt;
Insertion Anomaly: Can’t add a new course until a student registers.&lt;br&gt;
Update Anomaly: If Prof. Smith changes name → must update multiple rows.&lt;br&gt;
Deletion Anomaly: If Alice drops all courses → course info is lost.&lt;/p&gt;

&lt;p&gt;First Normal Form (1NF)&lt;br&gt;
Rule: Remove repeating groups and ensure atomic values.&lt;br&gt;
In our base table, values are already atomic, so 1NF just looks like this:&lt;br&gt;
CREATE TABLE StudentCourse (&lt;br&gt;
StudentID VARCHAR(10),&lt;br&gt;
StudentName VARCHAR(50),&lt;br&gt;
CourseID VARCHAR(10),&lt;br&gt;
CourseName VARCHAR(50),&lt;br&gt;
InstructorName VARCHAR(50),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Second Normal Form (2NF)&lt;br&gt;
Rule: Eliminate partial dependency (non-key attributes should depend on the whole primary key).&lt;br&gt;
Here, StudentName depends only on StudentID.&lt;br&gt;
CourseName and InstructorName depend only on CourseID.&lt;br&gt;
So, we split into three tables:&lt;br&gt;
-- Students Table&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
StudentID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
StudentName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;-- Courses Table&lt;br&gt;
CREATE TABLE Courses (&lt;br&gt;
CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
CourseName VARCHAR(50),&lt;br&gt;
InstructorName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;-- Relationship Table&lt;br&gt;
CREATE TABLE StudentCourse (&lt;br&gt;
StudentID VARCHAR(10),&lt;br&gt;
CourseID VARCHAR(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Third Normal Form (3NF)&lt;br&gt;
👉 Rule: Remove transitive dependency (non-key attribute depending on another non-key).&lt;br&gt;
InstructorName depends on CourseID, but instructor details should be separate.&lt;br&gt;
So, we restructure:&lt;br&gt;
-- Students Table&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
StudentID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
StudentName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;-- Instructors Table&lt;br&gt;
CREATE TABLE Instructors (&lt;br&gt;
InstructorID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
InstructorName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;-- Courses Table&lt;br&gt;
CREATE TABLE Courses (&lt;br&gt;
CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
CourseName VARCHAR(50),&lt;br&gt;
InstructorID VARCHAR(10),&lt;br&gt;
FOREIGN KEY (InstructorID) REFERENCES Instructors(InstructorID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;-- Relationship Table&lt;br&gt;
CREATE TABLE StudentCourse (&lt;br&gt;
StudentID VARCHAR(10),&lt;br&gt;
CourseID VARCHAR(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Students(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)&lt;br&gt;
);&lt;br&gt;
-- Insert Students&lt;br&gt;
INSERT INTO Students VALUES ('S1', 'Alice');&lt;br&gt;
INSERT INTO Students VALUES ('S2', 'Bob');&lt;/p&gt;

&lt;p&gt;-- Insert Instructors&lt;br&gt;
INSERT INTO Instructors VALUES ('I1', 'Prof. Smith');&lt;br&gt;
INSERT INTO Instructors VALUES ('I2', 'Prof. John');&lt;br&gt;
INSERT INTO Instructors VALUES ('I3', 'Prof. Mary');&lt;/p&gt;

&lt;p&gt;-- Insert Courses&lt;br&gt;
INSERT INTO Courses VALUES ('C101', 'DBMS', 'I1');&lt;br&gt;
INSERT INTO Courses VALUES ('C102', 'Networks', 'I2');&lt;br&gt;
INSERT INTO Courses VALUES ('C103', 'AI', 'I3');&lt;/p&gt;

&lt;p&gt;-- Student-Course Mapping&lt;br&gt;
INSERT INTO StudentCourse VALUES ('S1', 'C101');&lt;br&gt;
INSERT INTO StudentCourse VALUES ('S2', 'C102');&lt;br&gt;
INSERT INTO StudentCourse VALUES ('S1', 'C103');&lt;/p&gt;

&lt;p&gt;Query with JOINs&lt;br&gt;
Now, let’s list all students with their courses and instructors:&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN StudentCourse sc ON s.StudentID = sc.StudentID&lt;br&gt;
JOIN Courses c ON sc.CourseID = c.CourseID&lt;br&gt;
JOIN Instructors i ON c.InstructorID = i.InstructorID;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0sr52287agc2gam8m8lw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0sr52287agc2gam8m8lw.jpg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2gl7hd7h6mmapt5xcm47.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2gl7hd7h6mmapt5xcm47.jpg" alt=" " width="800" height="328"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faiys87c1bgp9b8llstdk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faiys87c1bgp9b8llstdk.jpg" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw10bsuejvgsht7i7jdr9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw10bsuejvgsht7i7jdr9.jpg" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw8r9nfwno5orr43j0ks.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw8r9nfwno5orr43j0ks.jpg" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>oracle</category>
      <category>learning</category>
    </item>
    <item>
      <title>Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Thu, 02 Oct 2025 06:03:11 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/transactions-deadlocks-log-based-recovery-35aj</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/transactions-deadlocks-log-based-recovery-35aj</guid>
      <description>&lt;p&gt;Transactions (Atomicity &amp;amp; Rollback)&lt;/p&gt;

&lt;p&gt;Deadlock Simulation&lt;/p&gt;

&lt;p&gt;Log-Based Recovery&lt;/p&gt;

&lt;p&gt;Schema Setup&lt;br&gt;
CREATE TABLE Accounts (&lt;br&gt;
    acc_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    balance INT&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES&lt;br&gt;
(1, 'Alice', 1000),&lt;br&gt;
(2, 'Bob', 1500),&lt;br&gt;
(3, 'Charlie', 2000);&lt;/p&gt;

&lt;p&gt;Initial state of table:&lt;/p&gt;

&lt;p&gt;acc_no  name    balance&lt;br&gt;
1   Alice   1000&lt;br&gt;
2   Bob 1500&lt;br&gt;
3   Charlie 2000&lt;br&gt;
 Transaction – Atomicity &amp;amp; Rollback&lt;/p&gt;

&lt;p&gt;We want to transfer 500 from Alice → Bob inside a transaction but rollback before commit.&lt;/p&gt;

&lt;p&gt;-- Start transaction&lt;br&gt;
START TRANSACTION;&lt;/p&gt;

&lt;p&gt;-- Deduct 500 from Alice&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance - 500&lt;br&gt;
WHERE name = 'Alice';&lt;/p&gt;

&lt;p&gt;-- Add 500 to Bob&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance + 500&lt;br&gt;
WHERE name = 'Bob';&lt;/p&gt;

&lt;p&gt;-- Rollback instead of commit&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;Verification&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;Balances remain unchanged (no partial update):&lt;/p&gt;

&lt;p&gt;acc_no  name    balance&lt;br&gt;
1   Alice   1000&lt;br&gt;
2   Bob 1500&lt;br&gt;
3   Charlie 2000&lt;/p&gt;

&lt;p&gt;This proves Atomicity: either all updates happen, or none.&lt;/p&gt;

&lt;p&gt;Deadlock Simulation&lt;/p&gt;

&lt;p&gt;We’ll open two SQL sessions to simulate a deadlock.&lt;/p&gt;

&lt;p&gt;Session 1&lt;br&gt;
START TRANSACTION;&lt;br&gt;
-- Lock Alice’s account&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE name = 'Alice';&lt;/p&gt;

&lt;p&gt;-- Now try to update Bob (this will wait if Session 2 has Bob locked)&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE name = 'Bob';&lt;/p&gt;

&lt;p&gt;Session 2&lt;br&gt;
START TRANSACTION;&lt;br&gt;
-- Lock Bob’s account&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE name = 'Bob';&lt;/p&gt;

&lt;p&gt;-- Now try to update Alice (this will wait if Session 1 has Alice locked)&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE name = 'Alice';&lt;/p&gt;

&lt;p&gt;At this point:&lt;/p&gt;

&lt;p&gt;Session 1 is waiting for Bob (locked by Session 2).&lt;/p&gt;

&lt;p&gt;Session 2 is waiting for Alice (locked by Session 1).&lt;/p&gt;

&lt;p&gt;This is a deadlock.&lt;/p&gt;

&lt;p&gt;Most databases (Oracle, MySQL, PostgreSQL, SQL Server) will detect the deadlock and automatically kill one transaction, rolling it back.&lt;/p&gt;

&lt;p&gt;You’ll see an error like:&lt;/p&gt;

&lt;p&gt;ERROR 1213 (40001): Deadlock found when trying to get lock&lt;/p&gt;

&lt;p&gt;Log-Based Recovery&lt;/p&gt;

&lt;p&gt;Databases maintain logs (MySQL = Binary Log, PostgreSQL = WAL, Oracle = Redo Logs). These logs allow recovery during crashes or rollbacks.&lt;/p&gt;

&lt;p&gt;Example – Transaction with rollback&lt;br&gt;
START TRANSACTION;&lt;/p&gt;

&lt;p&gt;UPDATE Accounts&lt;br&gt;
SET balance = balance + 200&lt;br&gt;
WHERE name = 'Charlie';&lt;/p&gt;

&lt;p&gt;ROLLBACK;&lt;/p&gt;

&lt;p&gt;The update is written to the log.&lt;/p&gt;

&lt;p&gt;The rollback adds a corresponding undo entry.&lt;/p&gt;

&lt;p&gt;If the system crashes, the recovery process replays the log and ensures Charlie’s balance remains unchanged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2b64cdw07cn2tw3owl4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2b64cdw07cn2tw3owl4u.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vejx89sx66hl8d3hprh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vejx89sx66hl8d3hprh.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5juf5fonz1u44enwgr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5juf5fonz1u44enwgr9.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>sql</category>
    </item>
    <item>
      <title>Cursor &amp; Trigger with Examples</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Thu, 02 Oct 2025 05:35:58 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/cursor-trigger-with-examples-hb5</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/cursor-trigger-with-examples-hb5</guid>
      <description>&lt;p&gt;Part 1: Cursor – Process Cursor with Condition&lt;br&gt;
Problem Statement&lt;/p&gt;

&lt;p&gt;We need to create a cursor that displays employee names whose salary is greater than 50,000 from the Employee table.&lt;/p&gt;

&lt;p&gt;Steps&lt;/p&gt;

&lt;p&gt;Create the Employee table (if not already available):&lt;/p&gt;

&lt;p&gt;CREATE TABLE Employee (&lt;br&gt;
    EmpID INT PRIMARY KEY,&lt;br&gt;
    EmpName VARCHAR(50),&lt;br&gt;
    Salary DECIMAL(10,2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Insert some sample records:&lt;/p&gt;

&lt;p&gt;INSERT INTO Employee (EmpID, EmpName, Salary) VALUES&lt;br&gt;
(1, 'Alice', 60000),&lt;br&gt;
(2, 'Bob', 48000),&lt;br&gt;
(3, 'Charlie', 75000),&lt;br&gt;
(4, 'David', 45000),&lt;br&gt;
(5, 'Eve', 90000);&lt;/p&gt;

&lt;p&gt;Create and use the Cursor:&lt;/p&gt;

&lt;p&gt;DECLARE @EmpName VARCHAR(50), @Salary DECIMAL(10,2);&lt;/p&gt;

&lt;p&gt;DECLARE EmployeeCursor CURSOR FOR&lt;br&gt;
SELECT EmpName, Salary &lt;br&gt;
FROM Employee&lt;br&gt;
WHERE Salary &amp;gt; 50000;&lt;/p&gt;

&lt;p&gt;OPEN EmployeeCursor;&lt;/p&gt;

&lt;p&gt;FETCH NEXT FROM EmployeeCursor INTO @EmpName, @Salary;&lt;/p&gt;

&lt;p&gt;WHILE @@FETCH_STATUS = 0&lt;br&gt;
BEGIN&lt;br&gt;
    PRINT 'Employee: ' + @EmpName + ' | Salary: ' + CAST(@Salary AS VARCHAR);&lt;br&gt;
    FETCH NEXT FROM EmployeeCursor INTO @EmpName, @Salary;&lt;br&gt;
END;&lt;/p&gt;

&lt;p&gt;CLOSE EmployeeCursor;&lt;br&gt;
DEALLOCATE EmployeeCursor;&lt;/p&gt;

&lt;p&gt;Output Example&lt;/p&gt;

&lt;p&gt;Only employees with salaries greater than 50,000 will be displayed:&lt;/p&gt;

&lt;p&gt;Employee: Alice | Salary: 60000&lt;br&gt;
Employee: Charlie | Salary: 75000&lt;br&gt;
Employee: Eve | Salary: 90000&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapkg9hmohxd9tggh0pjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapkg9hmohxd9tggh0pjr.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📌 Part 2: Trigger – AFTER INSERT Trigger on Student Table&lt;br&gt;
Problem Statement&lt;/p&gt;

&lt;p&gt;Whenever a new student is added to the Students table, we want to automatically insert a log entry into the Student_Audit table.&lt;/p&gt;

&lt;p&gt;Steps&lt;/p&gt;

&lt;p&gt;Create Students table:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    StudentID INT PRIMARY KEY,&lt;br&gt;
    StudentName VARCHAR(50),&lt;br&gt;
    Department VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Create Student_Audit table:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Student_Audit (&lt;br&gt;
    AuditID INT IDENTITY(1,1) PRIMARY KEY,&lt;br&gt;
    StudentID INT,&lt;br&gt;
    Action VARCHAR(50),&lt;br&gt;
    ActionDate DATETIME&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Create the Trigger:&lt;/p&gt;

&lt;p&gt;CREATE TRIGGER trg_AfterStudentInsert&lt;br&gt;
ON Students&lt;br&gt;
AFTER INSERT&lt;br&gt;
AS&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO Student_Audit (StudentID, Action, ActionDate)&lt;br&gt;
    SELECT StudentID, 'INSERT', GETDATE()&lt;br&gt;
    FROM inserted;&lt;br&gt;
END;&lt;/p&gt;

&lt;p&gt;Test the Trigger by inserting a new student:&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, StudentName, Department) &lt;br&gt;
VALUES (101, 'Rahul', 'Computer Science');&lt;/p&gt;

&lt;p&gt;Check the Audit table:&lt;/p&gt;

&lt;p&gt;SELECT * FROM Student_Audit;&lt;/p&gt;

&lt;p&gt;Output Example&lt;/p&gt;

&lt;h2&gt;
  
  
  AuditID | StudentID | Action | ActionDate
&lt;/h2&gt;

&lt;p&gt;1       | 101       | INSERT | 2025-10-02 10:15:32&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8to8ol0zp23xuopdwtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8to8ol0zp23xuopdwtv.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>sql</category>
    </item>
    <item>
      <title>CRUD Operations in MongoDB Atlas – A Beginner’s Guide with Student Database Example</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Wed, 01 Oct 2025 14:01:00 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-2mfo</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-2mfo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MongoDB is one of the most popular NoSQL databases used by developers today for building modern, scalable applications. Unlike traditional relational databases, MongoDB stores data in flexible JSON-like documents, making it easier to work with real-world scenarios.&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you through CRUD operations (Create, Read, Update, Delete) in MongoDB using a simple example: a college student database.&lt;/p&gt;

&lt;p&gt;We’ll:&lt;/p&gt;

&lt;p&gt;Insert student details&lt;/p&gt;

&lt;p&gt;Query them with filters&lt;/p&gt;

&lt;p&gt;Update academic information&lt;/p&gt;

&lt;p&gt;Delete records when needed&lt;/p&gt;

&lt;p&gt;To make it more exciting, we’ll run these queries directly on MongoDB Atlas Cluster (cloud-based MongoDB). You can also include screenshots of the MongoDB Atlas dashboard and outputs so readers can follow visually.&lt;/p&gt;

&lt;p&gt;Outcome&lt;/p&gt;

&lt;p&gt;By the end of this blog, you’ll learn:&lt;/p&gt;

&lt;p&gt;How to insert multiple documents into a collection&lt;/p&gt;

&lt;p&gt;How to read and filter records using queries&lt;/p&gt;

&lt;p&gt;How to update documents (single &amp;amp; multiple)&lt;/p&gt;

&lt;p&gt;How to delete documents based on conditions&lt;/p&gt;

&lt;p&gt;How CRUD fits into real-world development&lt;/p&gt;

&lt;p&gt;Setup: Creating a Cluster&lt;/p&gt;

&lt;p&gt;Create a free MongoDB Atlas account → MongoDB Atlas&lt;/p&gt;

&lt;p&gt;Create a cluster (choose the free tier).&lt;/p&gt;

&lt;p&gt;Inside the cluster, create a database called collegeDB.&lt;/p&gt;

&lt;p&gt;Inside collegeDB, create a collection called students.&lt;/p&gt;

&lt;p&gt;Create (Insert)&lt;/p&gt;

&lt;p&gt;We’ll start by inserting student records into our students collection.&lt;/p&gt;

&lt;p&gt;Each student is stored as a separate document:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "student_id": "S001",&lt;br&gt;
  "name": "Kavin",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "CSBS",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 9&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "student_id": "S002",&lt;br&gt;
  "name": "Natpu",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "CSBS",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 9&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Insert multiple documents:&lt;/p&gt;

&lt;p&gt;db.students.insertMany([&lt;br&gt;
  {&lt;br&gt;
    student_id: "S001",&lt;br&gt;
    name: "Kavin",&lt;br&gt;
    age: 20,&lt;br&gt;
    department: "CSBS",&lt;br&gt;
    year: 2,&lt;br&gt;
    cgpa: 9&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    student_id: "S002",&lt;br&gt;
    name: "Natpu",&lt;br&gt;
    age: 20,&lt;br&gt;
    department: "CSBS",&lt;br&gt;
    year: 2,&lt;br&gt;
    cgpa: 9&lt;br&gt;
  }&lt;br&gt;
])&lt;/p&gt;

&lt;p&gt;Read (Query)&lt;/p&gt;

&lt;p&gt;Fetch all students:&lt;/p&gt;

&lt;p&gt;db.students.find({})&lt;/p&gt;

&lt;p&gt;Find all students with CGPA &amp;gt; 8:&lt;/p&gt;

&lt;p&gt;db.students.find({ cgpa: { $gt: 8 } })&lt;/p&gt;

&lt;p&gt;Find students belonging to Computer Science department:&lt;/p&gt;

&lt;p&gt;db.students.find({ department: "CSE" })&lt;/p&gt;

&lt;p&gt;Update&lt;/p&gt;

&lt;p&gt;Update CGPA of a specific student:&lt;/p&gt;

&lt;p&gt;db.students.updateOne(&lt;br&gt;
  { student_id: "S005" },&lt;br&gt;
  { $set: { cgpa: 9.2 } }&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;Increase year of study for all 3rd-year students:&lt;/p&gt;

&lt;p&gt;db.students.updateMany(&lt;br&gt;
  { year: 3 },&lt;br&gt;
  { $inc: { year: 1 } }&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;Delete&lt;/p&gt;

&lt;p&gt;Delete one student record by ID:&lt;/p&gt;

&lt;p&gt;db.students.deleteOne({ student_id: "S004" })&lt;/p&gt;

&lt;p&gt;Delete all students having CGPA &amp;lt; 7.5:&lt;/p&gt;

&lt;p&gt;db.students.deleteMany({ cgpa: { $lt: 7.5 } })&lt;/p&gt;

&lt;p&gt;Troubleshooting: JSON Error in Node.js&lt;/p&gt;

&lt;p&gt;If you’re connecting MongoDB with a Node.js backend, you might run into this error:&lt;/p&gt;

&lt;p&gt;Failed to execute 'json' on 'Response': Unexpected end of JSON input&lt;/p&gt;

&lt;p&gt;app.post("/students", async (req, res) =&amp;gt; {&lt;br&gt;
  try {&lt;br&gt;
    const result = await db.collection("students").insertOne(req.body);&lt;br&gt;
    res.json({ success: true, id: result.insertedId }); &lt;br&gt;
  } catch (err) {&lt;br&gt;
    res.status(500).json({ error: err.message });&lt;br&gt;
  }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;On the frontend, check if the response has content before parsing:&lt;/p&gt;

&lt;p&gt;const response = await fetch("/students");&lt;br&gt;
let data = {};&lt;/p&gt;

&lt;p&gt;try {&lt;br&gt;
  data = await response.json();&lt;br&gt;
} catch (e) {&lt;br&gt;
  console.warn("Empty or invalid JSON response");&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;In this blog, we explored how to perform CRUD operations in MongoDB using a real-world example of a student database.&lt;/p&gt;

&lt;p&gt;We:&lt;/p&gt;

&lt;p&gt;Inserted multiple records&lt;/p&gt;

&lt;p&gt;Queried documents with conditions&lt;/p&gt;

&lt;p&gt;Updated both single and multiple entries&lt;/p&gt;

&lt;p&gt;Deleted documents selectively&lt;/p&gt;

&lt;p&gt;CRUD operations form the building blocks of every application, whether you’re managing users in a website, products in an e-commerce app, or students in a college system.&lt;/p&gt;

&lt;p&gt;This step-by-step approach not only gave us hands-on practice with MongoDB but also demonstrated how database schemas fit into real-world academic systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzde83pj79wwm5rolj9na.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzde83pj79wwm5rolj9na.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; sir for guiding and motivating us.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>College Student &amp; Course Management System</title>
      <dc:creator>NatpuEnean VA</dc:creator>
      <pubDate>Thu, 21 Aug 2025 14:28:37 +0000</pubDate>
      <link>https://forem.com/natpuenean_va_27a0f631f48/college-student-course-management-system-4jg8</link>
      <guid>https://forem.com/natpuenean_va_27a0f631f48/college-student-course-management-system-4jg8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
This blog covers the implementation of a simple College Student &amp;amp; Course Management System using SQL on Oracle LiveSQL. It demonstrates key database concepts such as table creation, data insertion, constraint addition, queries with functions and aggregates, joins, views, and stored procedures.&lt;/p&gt;

&lt;p&gt;The use case focuses on managing students, courses, enrollments, and faculty members with related operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Schema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The database contains four main tables: Students, Courses, Enrollments, and Faculty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
  StudentID NUMBER PRIMARY KEY,&lt;br&gt;
  Name VARCHAR2(50) NOT NULL,&lt;br&gt;
  Dept VARCHAR2(30),&lt;br&gt;
  DOB DATE,&lt;br&gt;
  Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Course Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
  CourseID NUMBER PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR2(50) NOT NULL,&lt;br&gt;
  Credits NUMBER(2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enrollments Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
  EnrollID NUMBER PRIMARY KEY,&lt;br&gt;
  StudentID NUMBER REFERENCES Students(StudentID),&lt;br&gt;
  CourseID NUMBER REFERENCES Courses(CourseID),&lt;br&gt;
  Grade CHAR(2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faculty Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Faculty (&lt;br&gt;
  FacultyID NUMBER PRIMARY KEY,&lt;br&gt;
  FacultyName VARCHAR2(50) NOT NULL,&lt;br&gt;
  Dept VARCHAR2(30),&lt;br&gt;
  Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Insertion&lt;/strong&gt;&lt;br&gt;
INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (1, 'Daniel Green', 'Information Technology', TO_DATE('2002-02-10', 'YYYY-MM-DD'), '&lt;a href="mailto:daniel.green@example.com"&gt;daniel.green@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (2, 'Emma White', 'Electronics', TO_DATE('2001-08-05', 'YYYY-MM-DD'), '&lt;a href="mailto:emma.white@example.com"&gt;emma.white@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (3, 'Frank Lee', 'Mechanical', TO_DATE('2003-01-19', 'YYYY-MM-DD'), '&lt;a href="mailto:frank.lee@example.com"&gt;frank.lee@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (201, 'Operating Systems', 4);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (202, 'Digital Circuits', 3);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (203, 'Thermodynamics', 5);&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (1, 1, 201, 'A');&lt;br&gt;
INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (2, 2, 202, 'B');&lt;br&gt;
INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (3, 3, 203, 'A-');&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table Alterations and Constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ALTER TABLE Students ADD PhoneNo VARCHAR2(10);&lt;/p&gt;

&lt;p&gt;ALTER TABLE Courses ADD CONSTRAINT chk_credits CHECK (Credits BETWEEN 1 AND 5);&lt;/p&gt;

&lt;p&gt;SQL Queries with Functions and Aggregates&lt;br&gt;
Example 1: Listing student names in uppercase and length of their emails&lt;/p&gt;

&lt;p&gt;SELECT UPPER(Name) AS UppercaseName, LENGTH(Email) AS EmailLength &lt;br&gt;
FROM Students;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UppercaseName&lt;/th&gt;
&lt;th&gt;EmailLength&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DANIEL GREEN&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMMA WHITE&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FRANK LEE&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example 2: Calculating average course credits and counting enrolled students&lt;/p&gt;

&lt;p&gt;SELECT&lt;br&gt;
  (SELECT AVG(Credits) FROM Courses) AS AvgCredits,&lt;br&gt;
  (SELECT COUNT(DISTINCT StudentID) FROM Enrollments) AS TotalStudentsEnrolled&lt;br&gt;
FROM dual;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AvgCredits&lt;/th&gt;
&lt;th&gt;TotalStudentsEnrolled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;JOIN Queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Joining Students, Enrollments, and Courses to show which student is enrolled in which course along with grades:&lt;/p&gt;

&lt;p&gt;SELECT s.Name AS StudentName, c.CourseName, e.Grade&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN Enrollments e ON s.StudentID = e.StudentID&lt;br&gt;
JOIN Courses c ON c.CourseID = e.CourseID;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentName&lt;/th&gt;
&lt;th&gt;CourseName&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daniel Green&lt;/td&gt;
&lt;td&gt;Operating Systems&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emma White&lt;/td&gt;
&lt;td&gt;Digital Circuits&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frank Lee&lt;/td&gt;
&lt;td&gt;Thermodynamics&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GROUP BY and HAVING Clause&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Counting students in each department and filtering departments with more than 1 student:&lt;/p&gt;

&lt;p&gt;SELECT Dept, COUNT(&lt;em&gt;) AS StudentCount&lt;br&gt;
FROM Students&lt;br&gt;
GROUP BY Dept&lt;br&gt;
HAVING COUNT(&lt;/em&gt;) &amp;gt; 1;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dept&lt;/th&gt;
&lt;th&gt;StudentCount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(No dept with &amp;gt;1 student in current data)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Views&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE VIEW StudentCoursesView AS&lt;br&gt;
SELECT s.Name AS StudentName, c.CourseName, e.Grade&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN Enrollments e ON s.StudentID = e.StudentID&lt;br&gt;
JOIN Courses c ON c.CourseID = e.CourseID;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stored Procedure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE PROCEDURE UpdateGrade (&lt;br&gt;
  p_StudentID IN NUMBER,&lt;br&gt;
  p_CourseID IN NUMBER,&lt;br&gt;
  p_NewGrade IN CHAR&lt;br&gt;
) AS&lt;br&gt;
BEGIN&lt;br&gt;
  UPDATE Enrollments&lt;br&gt;
  SET Grade = p_NewGrade&lt;br&gt;
  WHERE StudentID = p_StudentID AND CourseID = p_CourseID;&lt;br&gt;
  COMMIT;&lt;br&gt;
END;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This assignment reinforced understanding of:&lt;/p&gt;

&lt;p&gt;Creating and managing SQL database schemas&lt;/p&gt;

&lt;p&gt;Writing data manipulation queries&lt;/p&gt;

&lt;p&gt;Using SQL functions and aggregate operations&lt;/p&gt;

&lt;p&gt;Performing joins to combine related data&lt;/p&gt;

&lt;p&gt;Creating views and stored procedures to enhance SQL capabilities&lt;/p&gt;

&lt;p&gt;You can try the full script on Oracle LiveSQL to see these operations in action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxsa9t5a8857zjezyw1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxsa9t5a8857zjezyw1b.png" alt=" " width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>oracle</category>
      <category>database</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
