<?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: Arun Prasath</title>
    <description>The latest articles on Forem by Arun Prasath (@arun_prasath_fa013c5e6085).</description>
    <link>https://forem.com/arun_prasath_fa013c5e6085</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%2F3472600%2F5ade75a6-dad1-4466-8565-ca4df82505e0.png</url>
      <title>Forem: Arun Prasath</title>
      <link>https://forem.com/arun_prasath_fa013c5e6085</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/arun_prasath_fa013c5e6085"/>
    <language>en</language>
    <item>
      <title>CRUD Operations in MongoDB Atlas – A Beginner’s Guide with Student Database Example</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Mon, 06 Oct 2025 03:45:24 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-3bhp</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-3bhp</guid>
      <description>&lt;p&gt;Introduction&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": "01",&lt;br&gt;
"name": "Arun",&lt;br&gt;
"age": 20,&lt;br&gt;
"department": "CSBS",&lt;br&gt;
"year": 2,&lt;br&gt;
"cgpa": 8&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
"student_id": "02",&lt;br&gt;
"name": "Rohit",&lt;br&gt;
"age": 19,&lt;br&gt;
"department": "CSBS",&lt;br&gt;
"year": 2,&lt;br&gt;
"cgpa": 8.2&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: "01",&lt;br&gt;
name: "Arun",&lt;br&gt;
age: 20,&lt;br&gt;
department: "CSBS",&lt;br&gt;
year: 2,&lt;br&gt;
cgpa: 8&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
student_id: "02",&lt;br&gt;
name: "Rohit",&lt;br&gt;
age: 19,&lt;br&gt;
department: "CSBS",&lt;br&gt;
year: 2,&lt;br&gt;
cgpa: 8.2&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: "05" },&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: "04" })&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%2Fs7x44a4ny2p2eg27eecb.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%2Fs7x44a4ny2p2eg27eecb.png" alt=" " width="800" height="427"&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>programming</category>
      <category>coding</category>
      <category>mongodb</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization in DBMS</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Sun, 05 Oct 2025 07:51:17 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/indexing-hashing-query-optimization-in-dbms-b9p</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/indexing-hashing-query-optimization-in-dbms-b9p</guid>
      <description>&lt;p&gt;Databases handle massive data efficiently using indexes and hashing. Instead of scanning entire tables, indexes act like the index of a book, making lookups faster.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll build a Students table, create B-Tree, B+Tree, and Hash indexes, and run queries to see their effect.&lt;/p&gt;

&lt;p&gt;📖 Key Definitions&lt;br&gt;
🔹 Indexing&lt;/p&gt;

&lt;p&gt;Indexing is a technique to speed up data retrieval from a database. Instead of scanning the whole table, the database uses an index (like a book index) to locate the rows quickly.&lt;/p&gt;

&lt;p&gt;B-Tree Index&lt;/p&gt;

&lt;p&gt;A B-Tree (Balanced Tree) index stores keys in a sorted order, allowing logarithmic time searches. It is efficient for:&lt;/p&gt;

&lt;p&gt;B+ Tree Index&lt;/p&gt;

&lt;p&gt;A B+ Tree is a variation of the B-Tree where all values are stored in the leaf nodes, and internal nodes only store keys for navigation.&lt;/p&gt;

&lt;p&gt;Hash Index&lt;/p&gt;

&lt;p&gt;A Hash Index uses a hashing function to map keys (like dept) into buckets.&lt;/p&gt;

&lt;p&gt;Query Optimization&lt;/p&gt;

&lt;p&gt;The process of minimising query execution time by leveraging indexes and writing efficient SQL statements.&lt;/p&gt;

&lt;p&gt;Step 1: Create Students Table&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students1 (&lt;br&gt;
roll_no INT PRIMARY KEY,&lt;br&gt;
name VARCHAR2(50),&lt;br&gt;
dept VARCHAR2(20),&lt;br&gt;
cgpa NUMBER(3,2)&lt;br&gt;
);&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%2Fjf01s04dqci8wdcsllx1.webp" 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%2Fjf01s04dqci8wdcsllx1.webp" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inserting Sample Records&lt;/p&gt;

&lt;p&gt;INSERT INTO Students1 VALUES (101, 'Ana', 'CSBS', 8.5);&lt;br&gt;
INSERT INTO Students1 VALUES (102, 'Paul', 'CSBS', 7.8);&lt;br&gt;
INSERT INTO Students1 VALUES (103, 'Kevin', 'ECE', 9.0);&lt;br&gt;
INSERT INTO Students1 VALUES (104, 'Angelin', 'ME', 8.2);&lt;br&gt;
INSERT INTO Students1 VALUES (105, 'Vanessa', 'CSBS', 8.8);&lt;br&gt;
INSERT INTO Students1 VALUES (106, 'Ria', 'ECE', 7.5);&lt;br&gt;
INSERT INTO Students1 VALUES (107, 'Samuel', 'ME', 8.7);&lt;br&gt;
INSERT INTO Students1 VALUES (108, 'Noah', 'CSBS', 6.9);&lt;br&gt;
INSERT INTO Students1 VALUES (109, 'Marin', 'ECE', 8.0);&lt;br&gt;
INSERT INTO Students1 VALUES (110, 'Joseph', 'CSBS', 9.2);&lt;br&gt;
INSERT INTO Students1 VALUES (111, 'Trinita', 'ME', 7.9);&lt;br&gt;
INSERT INTO Students1 VALUES (112, 'Ryan', 'CSBS', 8.3);&lt;br&gt;
INSERT INTO Students1 VALUES (113, 'Daniel', 'ECE', 9.1);&lt;br&gt;
INSERT INTO Students1 VALUES (114, 'Kane', 'ME', 7.7);&lt;br&gt;
INSERT INTO Students1 VALUES (115, 'Isha', 'CSBS', 8.6);&lt;br&gt;
INSERT INTO Students1 VALUES (116, 'Sarah', 'ECE', 8.4);&lt;br&gt;
INSERT INTO Students1 VALUES (117, 'Merlin', 'ME', 8.0);&lt;br&gt;
INSERT INTO Students1 VALUES (118, 'James', 'CSBS', 7.6);&lt;br&gt;
INSERT INTO Students1 VALUES (119, 'Page', 'ECE', 8.9);&lt;br&gt;
INSERT INTO Students1 VALUES (120, 'Reynolds', 'ME', 8.1);&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%2F007bk8n9ajfnbezcche4.webp" 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%2F007bk8n9ajfnbezcche4.webp" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B-Tree Index on roll_no&lt;br&gt;
Most DBMSs use B-Trees to index numeric/ordered columns.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_roll_no ON Students1(roll_no);&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%2Ftqfy4fe3ppkuvgv3f1w1.webp" 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%2Ftqfy4fe3ppkuvgv3f1w1.webp" alt=" " width="800" height="398"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Query with Index&lt;br&gt;
This fetches details of roll_no = 110 in O(log n) instead of scanning all rows.&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students1 WHERE roll_no = 110;&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%2Fwgbubnazz1b1wf7ljswc.webp" 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%2Fwgbubnazz1b1wf7ljswc.webp" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B+ Tree Index on CGPA&lt;br&gt;
B+ Trees are used for range queries, making them perfect for CGPA lookups.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_cgpa ON Students1(cgpa);&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%2Fgs692a3jq6tj0uilptx6.webp" 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%2Fgs692a3jq6tj0uilptx6.webp" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Query&lt;br&gt;
Display all students with a CGPA&amp;gt; 8.0&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students1 WHERE cgpa &amp;gt; 8.0;&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%2F7iosvag3xm2dmfmnspns.webp" 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%2F7iosvag3xm2dmfmnspns.webp" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hash Index on dept&lt;br&gt;
Hashing is great for exact matches (not ranges).&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_dept ON Students1(dept);&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%2Fo879a5moopxb6ukpzt4v.webp" 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%2Fo879a5moopxb6ukpzt4v.webp" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Query&lt;br&gt;
Retrieve all students from the CSBS department&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students1 WHERE dept = 'CSBS';&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%2Fyjoe5sasezk4i3i6h5ue.webp" 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%2Fyjoe5sasezk4i3i6h5ue.webp" alt=" " width="800" height="390"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;⚡ Wrap Up&lt;/p&gt;

&lt;p&gt;In this tutorial, we explored:&lt;/p&gt;

&lt;p&gt;B-Tree Index → Fast lookup by roll_no&lt;/p&gt;

&lt;p&gt;B+Tree Index → Efficient range queries (CGPA &amp;gt; 8.0)&lt;/p&gt;

&lt;p&gt;Hash Index → Quick equality checks (dept = CSBS)&lt;/p&gt;

&lt;p&gt;Indexes make queries 10x–100x faster, but they also consume storage &amp;amp; slow down inserts/updates. Use them wisely for query optimization!&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 me through indexing and query optimization concepts.&lt;/p&gt;

&lt;p&gt;SQL #Oracle #Indexing #BTree #BPlusTree #QueryOptimization #DBMS #Database&lt;/p&gt;

</description>
      <category>coding</category>
      <category>database</category>
      <category>learning</category>
    </item>
    <item>
      <title>DBMS - Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Sun, 05 Oct 2025 07:40:37 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/dbms-transactions-deadlocks-log-based-recovery-26g7</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/dbms-transactions-deadlocks-log-based-recovery-26g7</guid>
      <description>&lt;p&gt;Working with databases is not just about storing data — it’s about ensuring reliability, atomicity, and consistency, especially when multiple users or processes are involved. In this post, we’ll explore three important concepts using a simple Accounts table:&lt;/p&gt;

&lt;p&gt;✅ Transactions &amp;amp; Rollback (Atomicity)&lt;/p&gt;

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

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

&lt;p&gt;Setup: The Accounts Table&lt;/p&gt;

&lt;p&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;&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%2F4p519u5lgehxnxkkoi5k.webp" 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%2F4p519u5lgehxnxkkoi5k.webp" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO CustomerAccounts VALUES (1, 'Emily', 1000);&lt;br&gt;
INSERT INTO CustomerAccounts VALUES (2, 'Bobby', 1500);&lt;br&gt;
INSERT INTO CustomerAccounts VALUES (3, 'Caleb', 2000);&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%2Fh9f7y6qtrs277ve7kmur.webp" 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%2Fh9f7y6qtrs277ve7kmur.webp" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SELECT * FROM CustomerAccounts;&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%2F2dyp8dej6povxigyq1n8.webp" 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%2F2dyp8dej6povxigyq1n8.webp" alt=" " width="800" height="403"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Transaction – Atomicity &amp;amp; Rollback&lt;/p&gt;

&lt;p&gt;Transactions ensure all-or-nothing execution. Let’s try transferring 500 from Emily to Bobby, but roll it back midway.&lt;/p&gt;

&lt;p&gt;Deduct 500 from Emily&lt;/p&gt;

&lt;p&gt;UPDATE CustomerAccounts&lt;br&gt;
SET balance = balance - 500&lt;br&gt;
WHERE name = 'Emily';&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%2Ff6vzenf9shnscuzwfvaz.webp" 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%2Ff6vzenf9shnscuzwfvaz.webp" alt=" " width="800" height="392"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Add 500 to Bobby&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 transaction&lt;/p&gt;

&lt;p&gt;ROLLBACK;&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%2Fi6uhzbm585hmjtjej4kx.webp" 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%2Fi6uhzbm585hmjtjej4kx.webp" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;** Check balances**&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&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%2F161im8ry9q3dxpukfk6y.webp" 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%2F161im8ry9q3dxpukfk6y.webp" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Deadlocks occur when two transactions wait on each other’s locks. Let’s simulate with two sessions:&lt;/p&gt;

&lt;p&gt;Session 1:&lt;/p&gt;

&lt;p&gt;-- Lock Emily&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE name = 'Emily';&lt;br&gt;
-- Do NOT commit&lt;/p&gt;

&lt;p&gt;Session 2:&lt;br&gt;
-- Lock Bobby&lt;br&gt;
UPDATE CustomerAccounts SET balance = balance - 200 WHERE name = 'Bobby';&lt;br&gt;
-- Do NOT commit&lt;/p&gt;

&lt;p&gt;Continuing Session 1&lt;br&gt;
-- Try updating Bobby (held by Session2)&lt;br&gt;
UPDATE CustomerAccounts SET balance = balance + 100 WHERE name = 'Bobby';&lt;/p&gt;

&lt;p&gt;Continuing Session 2&lt;br&gt;
-- Try updating Emily (held by Session 1)&lt;br&gt;
UPDATE CustomerAccounts SET balance = balance + 200 WHERE name = 'Emily';&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%2Fg6omzjkdk53v7qv0uer7.webp" 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%2Fg6omzjkdk53v7qv0uer7.webp" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Modern DBMSs use logs (MySQL → Binary Log, PostgreSQL → WAL) to ensure durability and rollback safety.&lt;/p&gt;

&lt;p&gt;-- Update Caleb&lt;br&gt;
UPDATE CustomerAccounts SET balance = balance + 300 WHERE name = 'Caleb';&lt;/p&gt;

&lt;p&gt;-- Rollback&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;-- Verify balances&lt;br&gt;
SELECT * FROM CustomerAccounts;&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%2Fdjmjr062y2lecx4gtrah.webp" 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%2Fdjmjr062y2lecx4gtrah.webp" alt=" " width="800" height="372"&gt;&lt;/a&gt;&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%2Flz3l66vbgje760cuwv11.webp" 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%2Flz3l66vbgje760cuwv11.webp" alt=" " width="800" height="422"&gt;&lt;/a&gt;&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%2Fatrt6zf75u6v7w7kvkq7.webp" 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%2Fatrt6zf75u6v7w7kvkq7.webp" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wrap Up&lt;/p&gt;

&lt;p&gt;In this tutorial, we covered:&lt;/p&gt;

&lt;p&gt;Transactions &amp;amp; Rollback → Ensures atomicity&lt;/p&gt;

&lt;p&gt;Deadlock Simulation → Shows concurrency pitfalls&lt;/p&gt;

&lt;p&gt;Log-Based Recovery → Demonstrates how databases ensure durability&lt;/p&gt;

&lt;p&gt;These concepts form the backbone of ACID properties in relational databases.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; Sir for guidance throughout this assignment.&lt;/p&gt;

&lt;p&gt;dbms #oracle #sql #transactions #deadlock #recovery #assignment&lt;/p&gt;

</description>
      <category>programming</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>ACID Properties with SQL Transactions in DBMS</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Sun, 05 Oct 2025 06:51:45 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/acid-properties-with-sql-transactions-in-dbms-4ped</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/acid-properties-with-sql-transactions-in-dbms-4ped</guid>
      <description>&lt;p&gt;When working with relational databases, transactions are the building blocks that ensure reliability. They follow the ACID properties:&lt;/p&gt;

&lt;p&gt;Atomicity → All or nothing&lt;/p&gt;

&lt;p&gt;Consistency → Valid state before &amp;amp; after&lt;/p&gt;

&lt;p&gt;Isolation → Transactions don’t interfere&lt;/p&gt;

&lt;p&gt;Durability → Changes survive crashes&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore ACID with SQL scripts using an Accounts table.&lt;/p&gt;

&lt;p&gt;Creating a Database in MySql&lt;/p&gt;

&lt;p&gt;CREATE DATABASE acid_demo;&lt;br&gt;
USE acid_demo;&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%2Fk2re70g5ewaq0czdg7hn.webp" 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%2Fk2re70g5ewaq0czdg7hn.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Setup the Accounts Table&lt;/p&gt;

&lt;p&gt;CREATE TABLE Accounts (&lt;br&gt;
acc_no INT PRIMARY KEY,&lt;br&gt;
name VARCHAR(50),&lt;br&gt;
balance INT CHECK (balance &amp;gt;= 0)&lt;br&gt;
) ENGINE=InnoDB;&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%2Fwa0eg4wzz5m0obwt0ygm.webp" 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%2Fwa0eg4wzz5m0obwt0ygm.webp" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Insert 3 sample rows.&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts (acc_no, name, balance) VALUES&lt;br&gt;
(1, 'Sarah', 5000),&lt;br&gt;
(2, 'Jessie', 3000),&lt;br&gt;
(3, 'Benson', 7000);&lt;/p&gt;

&lt;p&gt;Run it.&lt;br&gt;
Output: 3 rows inserted&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%2Fmt4z8crjyznj7pthdtij.webp" 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%2Fmt4z8crjyznj7pthdtij.webp" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;SELECT * FROM Accounts;&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%2Fp0od8spmiw25isjg0oai.webp" 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%2Fp0od8spmiw25isjg0oai.webp" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
acc_no | name | balance&lt;br&gt;
1 | Sarah| 5000&lt;br&gt;
2 | Jessie | 3000&lt;br&gt;
3 | Benson | 7000&lt;/p&gt;

&lt;p&gt;Atomicity&lt;/p&gt;

&lt;p&gt;Definition: A transaction is atomic, meaning either all operations succeed or none do.&lt;/p&gt;

&lt;p&gt;Example: Transfer 500 from Sarah to Jessie, then rollback&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 1000 WHERE acc_no = 1;&lt;br&gt;
UPDATE Accounts SET balance = balance + 1000 WHERE acc_no = 2;&lt;br&gt;
ROLLBACK;&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
balances remain unchanged (Sarah=5000, Jessie=3000).&lt;br&gt;
This proves atomicity: either all updates happen, or none.&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%2F5v1o1gzimssd5lw86vl0.webp" 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%2F5v1o1gzimssd5lw86vl0.webp" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;COMMIT:&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 500 WHERE acc_no = 1;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 2;&lt;br&gt;
COMMIT;&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;Output: Sarah=4500, Jessie=3500.&lt;br&gt;
Committed → permanent update.&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%2Fmyay5meu2cw4tnriw9jp.webp" 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%2Fmyay5meu2cw4tnriw9jp.webp" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consistency&lt;/p&gt;

&lt;p&gt;Definition: A transaction must bring the database from one valid state to another. Rules like constraints must never be violated.&lt;/p&gt;

&lt;p&gt;Example: Try inserting negative balance&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts (acc_no, name, balance) VALUES (4, 'David', -500);&lt;/p&gt;

&lt;p&gt;Output: Error – CHECK constraint failed.&lt;br&gt;
Database rejects invalid data → consistency is preserved.&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%2Fd9jywog79kbx41wyvmbe.webp" 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%2Fd9jywog79kbx41wyvmbe.webp" alt=" " width="800" height="409"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Isolation&lt;/p&gt;

&lt;p&gt;Definition: Transactions executing at the same time should not interfere with each other.&lt;/p&gt;

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

&lt;p&gt;Session 1 (updating):&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 2000 WHERE acc_no = 1;&lt;br&gt;
-- Do not commit yet&lt;br&gt;
SELECT balance FROM Accounts WHERE acc_no = 1;&lt;/p&gt;

&lt;p&gt;Session 1 sees the reduced balance (2500).&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%2Fmith6c4or04919s4doil.webp" 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%2Fmith6c4or04919s4doil.webp" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Session 2 (reading at same time):&lt;/p&gt;

&lt;p&gt;SELECT balance FROM Accounts WHERE acc_no = 1;&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%2Fk3gujz475z6184u1ypff.webp" 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%2Fk3gujz475z6184u1ypff.webp" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Both sessions see Sarah back to 4500.&lt;br&gt;
This shows isolation.&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%2F60qhufssfvt6p699dmce.webp" 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%2F60qhufssfvt6p699dmce.webp" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Durability&lt;/p&gt;

&lt;p&gt;Definition: Once a transaction is committed, its changes persist even if the system crashes.&lt;/p&gt;

&lt;p&gt;Example: Commit, restart DB, check again&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 3;&lt;br&gt;
COMMIT;&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%2F9hhyy3swv2jq8t8rw2mh.webp" 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%2F9hhyy3swv2jq8t8rw2mh.webp" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;Benson’s balance increases (7500).&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%2Fy9kvyl155nozcu1pj0h2.webp" 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%2Fy9kvyl155nozcu1pj0h2.webp" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now restart MySQL server&lt;br&gt;
Reconnect, run again:&lt;/p&gt;

&lt;p&gt;USE acid_demo;&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;Balance is still 7500.&lt;br&gt;
This proves durability: committed changes survive restarts.&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%2Feia4a7eck9jep3a3o2a3.webp" 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%2Feia4a7eck9jep3a3o2a3.webp" alt=" " width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Wrap Up&lt;/p&gt;

&lt;p&gt;We demonstrated the ACID properties using SQL:&lt;/p&gt;

&lt;p&gt;🔹 Atomicity → Rollback prevents partial updates&lt;/p&gt;

&lt;p&gt;🔹 Consistency → Constraints keep data valid&lt;/p&gt;

&lt;p&gt;🔹 Isolation → Transactions run independently&lt;/p&gt;

&lt;p&gt;🔹 Durability → Committed changes survive crashes&lt;/p&gt;

&lt;p&gt;These principles ensure that databases remain reliable, safe, and trustworthy, even under concurrent workloads or unexpected failures.&lt;/p&gt;

&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; Sir for his guidance and support and for Everything&lt;/p&gt;

&lt;p&gt;dbms #MySql #oracle #transactions #acid #database #learning&lt;/p&gt;

</description>
      <category>programming</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Cursor and Trigger in DBMS</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Sun, 05 Oct 2025 06:35:43 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/cursor-and-trigger-in-dbms-12ji</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/cursor-and-trigger-in-dbms-12ji</guid>
      <description>&lt;p&gt;When working with databases, sometimes we need to process records row by row (using Cursors) or automatically respond to events (using Triggers).&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll:&lt;/p&gt;

&lt;p&gt;✅ Create a Cursor that fetches employees with a salary &amp;gt; 50,000&lt;/p&gt;

&lt;p&gt;✅ Build an AFTER-INSERT Trigger to maintain a student audit log&lt;/p&gt;

&lt;p&gt;🔹 Cursor&lt;/p&gt;

&lt;p&gt;A cursor is a pointer that lets you process query results row by row instead of all at once. Useful when applying conditions or logic to each record.&lt;/p&gt;

&lt;p&gt;Step 1: Employee Cursor Example&lt;/p&gt;

&lt;p&gt;Let’s create a cursor to display employee names with salary &amp;gt; 50,000.&lt;/p&gt;

&lt;p&gt;Step i: Create Employee Table&lt;/p&gt;

&lt;p&gt;CREATE TABLE Employees (&lt;br&gt;
Emp_ID NUMBER PRIMARY KEY,&lt;br&gt;
Emp_Name VARCHAR2(50),&lt;br&gt;
Salary NUMBER&lt;br&gt;
);&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%2Fh4er9i92dpaptnkdqinu.webp" 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%2Fh4er9i92dpaptnkdqinu.webp" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step ii: Insert Sample Data&lt;/p&gt;

&lt;p&gt;INSERT INTO Employees (Emp_ID, Emp_Name, Salary) VALUES (1, 'Renner', 60000);&lt;br&gt;
INSERT INTO Employees (Emp_ID, Emp_Name, Salary) VALUES (2, 'Samuel', 45000);&lt;br&gt;
INSERT INTO Employees (Emp_ID, Emp_Name, Salary) VALUES (3, 'Ana',&lt;br&gt;
75000);&lt;br&gt;
INSERT INTO Employees (Emp_ID, Emp_Name, Salary) VALUES (4, 'Kylie', 50000);&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%2Fi1bk9h22u04fj92ttjld.webp" 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%2Fi1bk9h22u04fj92ttjld.webp" alt=" " width="800" height="394"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Step iii: Cursor Implementation&lt;/p&gt;

&lt;p&gt;DECLARE&lt;br&gt;
CURSOR emp_cursor IS&lt;br&gt;
SELECT Emp_Name, Salary FROM Employees WHERE Salary &amp;gt; 50000;&lt;br&gt;
v_EmpName Employees.Emp_Name%TYPE;&lt;br&gt;
v_Salary Employees.Salary%TYPE;&lt;br&gt;
BEGIN&lt;br&gt;
OPEN emp_cursor;&lt;br&gt;
LOOP&lt;br&gt;
FETCH emp_cursor INTO v_EmpName, v_Salary;&lt;br&gt;
EXIT WHEN emp_cursor%NOTFOUND;&lt;br&gt;
DBMS_OUTPUT.PUT_LINE('Employees: ' || v_EmpName || ', Salary: ₹' || v_Salary);&lt;br&gt;
END LOOP;&lt;br&gt;
CLOSE emp_cursor;&lt;br&gt;
END;&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%2Fy561nsmwjx9kqzh95bx2.webp" 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%2Fy561nsmwjx9kqzh95bx2.webp" alt=" " width="800" height="354"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;🔹 Trigger&lt;/p&gt;

&lt;p&gt;A trigger is a stored program that automatically runs when a specific event occurs (like INSERT, UPDATE, or DELETE).&lt;/p&gt;

&lt;p&gt;Step 2:AFTER INSERT Trigger&lt;/p&gt;

&lt;p&gt;We’ll now create a Students table and a Students_Audit table to keep track of new registrations.&lt;/p&gt;

&lt;p&gt;Step i: Create Students Table&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students2 (&lt;br&gt;
Student_ID NUMBER PRIMARY KEY,&lt;br&gt;
Student_Name VARCHAR2(50),&lt;br&gt;
Course VARCHAR2(50)&lt;br&gt;
);&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%2F627g8d9rvz84zsi5nli8.webp" 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%2F627g8d9rvz84zsi5nli8.webp" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step ii: Create Students_Audit Table&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students_Audit (&lt;br&gt;
Audit_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br&gt;
Student_ID NUMBER,&lt;br&gt;
Student_Name VARCHAR2(50),&lt;br&gt;
Action VARCHAR2(50),&lt;br&gt;
Action_Time TIMESTAMP&lt;br&gt;
);&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%2F7yklmmknox7095vsci6o.webp" 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%2F7yklmmknox7095vsci6o.webp" alt=" " width="800" height="380"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Step iii: Create AFTER INSERT Trigger(Trigger Implementation)&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE TRIGGER trg_after_student_insert&lt;br&gt;
AFTER INSERT ON Students2&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
INSERT INTO Students_Audit (Student_ID, Student_Name, Action, Action_Time)&lt;br&gt;
VALUES (:NEW.Student_ID, :NEW.Student_Name, 'INSERT', SYSTIMESTAMP);&lt;br&gt;
END;&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%2Fchj93pbcp243h14a3kuf.webp" 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%2Fchj93pbcp243h14a3kuf.webp" alt=" " width="800" height="375"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Test the Trigger&lt;/p&gt;

&lt;p&gt;INSERT INTO Students2 (Student_ID, Student_Name, Course) VALUES (1, 'Renner', 'Computer Science');&lt;br&gt;
INSERT INTO Students2 (Student_ID, Student_Name, Course) VALUES (2, 'Martin', 'Mechanical Engineering');&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%2Ff5o2vb8osox1ydrkn3ul.webp" 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%2Ff5o2vb8osox1ydrkn3ul.webp" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step iv: Verify Audit Table&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students_Audit;&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%2F9ady7mzg561ywfrn22qm.webp" 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%2F9ady7mzg561ywfrn22qm.webp" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Wrap Up&lt;/p&gt;

&lt;p&gt;In this tutorial, we learned:&lt;/p&gt;

&lt;p&gt;Cursor → Process query results row by row&lt;/p&gt;

&lt;p&gt;Trigger → Automatically log student registrations after insert&lt;/p&gt;

&lt;p&gt;These features add power and automation to SQL programming!&lt;/p&gt;

&lt;p&gt;Thank &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; Sir for his valuable guidance and continuous support in successfully completing this DBMS assignment.&lt;/p&gt;

&lt;p&gt;dbms #sql #oracle #plsql #database #cursors #triggers #programming #assignment #learning&lt;/p&gt;

</description>
      <category>programming</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Database Normalization</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Sun, 05 Oct 2025 06:19:01 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/database-normalization-1l1m</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/database-normalization-1l1m</guid>
      <description>&lt;p&gt;Database Normalization:&lt;/p&gt;

&lt;p&gt;Database normalization is the process of structuring a relational database to reduce redundancy and improve data integrity.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll normalize a student-course-instructor dataset from Unnormalized Form → 1NF → 2NF → 3NF, and implement it in SQL.&lt;/p&gt;

&lt;p&gt;Step 1: Base Table&lt;/p&gt;

&lt;p&gt;The initial unnormalized table includes details of students, their courses, instructors, and corresponding grades.&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%2F5kxvqx5qv5vr7cvxh9m0.webp" 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%2F5kxvqx5qv5vr7cvxh9m0.webp" alt=" " width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Identifying Anomalies&lt;/p&gt;

&lt;p&gt;Insertion anomaly: A new course cannot be added unless it is linked to a student.&lt;/p&gt;

&lt;p&gt;Update anomaly: Modifying a course name requires updating it in several rows.&lt;/p&gt;

&lt;p&gt;Deletion anomaly: Removing a student may also remove valuable course details if that student was the only enrollee.&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%2Fo6s3hy90a62cen19rhu4.webp" 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%2Fo6s3hy90a62cen19rhu4.webp" alt=" " width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ First Normal Form (1NF)&lt;/p&gt;

&lt;p&gt;Rule: Eliminate repeating groups, ensure atomic values.&lt;/p&gt;

&lt;p&gt;So, we split multi-valued attributes into separate rows:&lt;/p&gt;

&lt;p&gt;SQL Table in 1 NF,&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students_1NF (&lt;br&gt;
Student_ID INT,&lt;br&gt;
Student_Name VARCHAR2(100),&lt;br&gt;
Course_ID INT,&lt;br&gt;
Course_Name VARCHAR2(100),&lt;br&gt;
Instructor VARCHAR2(100),&lt;br&gt;
Grade CHAR(2),&lt;br&gt;
PRIMARY KEY (Student_ID, Course_ID)&lt;br&gt;
);&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%2Fhi6axo6272bn7ns52am1.webp" 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%2Fhi6axo6272bn7ns52am1.webp" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ Second Normal Form (2NF)&lt;/p&gt;

&lt;p&gt;Rule: Remove partial dependency → non-key attributes should depend on the whole primary key.&lt;/p&gt;

&lt;p&gt;Here, student_id depends on student info, course_id depends on course info, and instructor depends on the course.&lt;br&gt;
So, we split into three tables:&lt;/p&gt;

&lt;p&gt;SQL Create Tables (2NF):&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
StudentID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
StudentName VARCHAR2(100)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
CourseID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
CourseName VARCHAR2(100),&lt;br&gt;
Instructor VARCHAR2(100),&lt;br&gt;
InstructorPhone VARCHAR2(15)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
StudentID VARCHAR2(10),&lt;br&gt;
CourseID VARCHAR2(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Course(CourseID)&lt;br&gt;
);&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%2Fqbddkc915wzo99xfb4yt.webp" 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%2Fqbddkc915wzo99xfb4yt.webp" alt=" " width="800" height="376"&gt;&lt;/a&gt;&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%2Fk3kl2uble4qfjfc6o0qg.webp" 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%2Fk3kl2uble4qfjfc6o0qg.webp" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3️⃣ Third Normal Form (3NF)&lt;/p&gt;

&lt;p&gt;Rule: Remove transitive dependencies (non-key attributes depending on other non-key attributes).&lt;/p&gt;

&lt;p&gt;Here, instructor_phone depends on instructor, not on course_id. So we separate Instructor data:&lt;/p&gt;

&lt;p&gt;SQL Create Tables (3NF):&lt;/p&gt;

&lt;p&gt;REATE TABLE Instructors (&lt;br&gt;
InstructorID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
InstructorName VARCHAR2(100),&lt;br&gt;
InstructorPhone VARCHAR2(15)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses3NF (&lt;br&gt;
CourseID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
CourseName VARCHAR2(100),&lt;br&gt;
InstructorID VARCHAR2(10),&lt;br&gt;
FOREIGN KEY (InstructorID) REFERENCES Instructor(InstructorID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students3NF (&lt;br&gt;
StudentID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
StudentName VARCHAR2(100)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments3NF (&lt;br&gt;
StudentID VARCHAR2(10),&lt;br&gt;
CourseID VARCHAR2(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Student3NF(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Course3NF(CourseID)&lt;br&gt;
);&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%2Fahqtzdg35mugv7g2fvel.webp" 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%2Fahqtzdg35mugv7g2fvel.webp" alt=" " width="800" height="387"&gt;&lt;/a&gt;&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%2Fy2mct9fnam02boqdh6xm.webp" 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%2Fy2mct9fnam02boqdh6xm.webp" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Insert Sample Data&lt;/p&gt;

&lt;p&gt;-- Instructors&lt;br&gt;
INSERT INTO Instructor VALUES ('I01', 'Dr. Kumar', '9876543210');&lt;br&gt;
INSERT INTO Instructor VALUES ('I02', 'Dr. Mehta', '9123456780');&lt;br&gt;
INSERT INTO Instructor VALUES ('I03', 'Dr. Rao', '9988776655');&lt;/p&gt;

&lt;p&gt;-- Courses&lt;br&gt;
INSERT INTO Course3NF VALUES ('C101', 'DBMS', 'I01');&lt;br&gt;
INSERT INTO Course3NF VALUES ('C102', 'Data Mining', 'I02');&lt;br&gt;
INSERT INTO Course3NF VALUES ('C103', 'AI', 'I03');&lt;/p&gt;

&lt;p&gt;-- Students&lt;br&gt;
INSERT INTO Student3NF VALUES ('S01', 'Arjun');&lt;br&gt;
INSERT INTO Student3NF VALUES ('S02', 'Priya');&lt;br&gt;
INSERT INTO Student3NF VALUES ('S03', 'Kiran');&lt;/p&gt;

&lt;p&gt;-- Enrollment&lt;br&gt;
INSERT INTO Enrollment3NF VALUES ('S01', 'C101');&lt;br&gt;
INSERT INTO Enrollment3NF VALUES ('S01', 'C102');&lt;br&gt;
INSERT INTO Enrollment3NF VALUES ('S02', 'C101');&lt;br&gt;
INSERT INTO Enrollment3NF VALUES ('S03', 'C103');&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%2Fh7jz41na9lvxfiyo8yqg.webp" 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%2Fh7jz41na9lvxfiyo8yqg.webp" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7: Query with JOINs&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName&lt;br&gt;
FROM Enrollment3NF e&lt;br&gt;
JOIN Student3NF s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Course3NF c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructor 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%2Fxqp9ahiyf6jdw6pj8ayb.webp" 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%2Fxqp9ahiyf6jdw6pj8ayb.webp" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀** Wrap Up**&lt;/p&gt;

&lt;p&gt;We started with an unnormalized table and step-by-step applied:&lt;/p&gt;

&lt;p&gt;1NF → Removed repeating groups&lt;/p&gt;

&lt;p&gt;2NF → Removed partial dependencies&lt;/p&gt;

&lt;p&gt;3NF → Removed transitive dependencies&lt;/p&gt;

&lt;p&gt;Result → A clean, normalized database with reduced redundancy, better integrity, and easier queries&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; for mentoring me on database normalization concepts!&lt;/p&gt;

&lt;p&gt;SQL #Oracle #DBMS #DatabaseNormalization #1NF #2NF #3NF #BCNF #4NF #5NF #DataModeling&lt;/p&gt;

</description>
      <category>programming</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Student Managment System</title>
      <dc:creator>Arun Prasath</dc:creator>
      <pubDate>Mon, 01 Sep 2025 08:14:12 +0000</pubDate>
      <link>https://forem.com/arun_prasath_fa013c5e6085/student-managment-system-10pp</link>
      <guid>https://forem.com/arun_prasath_fa013c5e6085/student-managment-system-10pp</guid>
      <description>&lt;p&gt;🚀 Step-by-Step SQL Assignment Execution (Oracle Live SQL)&lt;/p&gt;

&lt;p&gt;In this post, I am sharing my DBMS SQL Assignment execution using Oracle Live SQL.&lt;br&gt;
I have included explanations and screenshots for each step to make the process clear and easy to follow.&lt;/p&gt;

&lt;p&gt;1️⃣Create Faculty Table (DDL)&lt;/p&gt;

&lt;p&gt;The first task was to create a Faculty table with the following fields:&lt;/p&gt;

&lt;p&gt;FacultyID – Primary Key&lt;/p&gt;

&lt;p&gt;FacultyName – Not Null&lt;/p&gt;

&lt;p&gt;Dept – Department name&lt;/p&gt;

&lt;p&gt;Email – Unique constraint&lt;/p&gt;

&lt;p&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%2Ftm7uw6agez91lr5hvchc.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%2Ftm7uw6agez91lr5hvchc.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣Insert Students Data (DML)&lt;/p&gt;

&lt;p&gt;Next, I inserted three students into the Students table, each belonging to different departments.&lt;/p&gt;

&lt;p&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%2F56jnqu9kn8m4rae8nwa8.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%2F56jnqu9kn8m4rae8nwa8.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3️⃣Alter Table – Add Phone Number&lt;/p&gt;

&lt;p&gt;I modified the Students table to add a new column PhoneNo.&lt;br&gt;
This column ensures that phone numbers are 10 digits long.&lt;/p&gt;

&lt;p&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%2Fifnb0073bmswsfyilwgz.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%2Fifnb0073bmswsfyilwgz.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4️⃣Define Constraints on Courses Table&lt;/p&gt;

&lt;p&gt;The Courses table was updated with a constraint to make sure that Credits cannot be less than 1 or more than 5.&lt;/p&gt;

&lt;p&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%2Fqbn3aic19alqxp7o1g4i.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%2Fqbn3aic19alqxp7o1g4i.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5️⃣SELECT with Functions&lt;/p&gt;

&lt;p&gt;I displayed the student names in uppercase and also calculated the length of their email IDs.&lt;/p&gt;

&lt;p&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%2F42tfd46sec5p9qduglty.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%2F42tfd46sec5p9qduglty.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
