<?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>DEV Community: Reshma Devi</title>
    <description>The latest articles on DEV Community by Reshma Devi (@reshma_devi_ba32b2f54397d).</description>
    <link>https://dev.to/reshma_devi_ba32b2f54397d</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%2F3472873%2Fff98aae4-fbd7-4750-b921-8634df9bf351.jpg</url>
      <title>DEV Community: Reshma Devi</title>
      <link>https://dev.to/reshma_devi_ba32b2f54397d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reshma_devi_ba32b2f54397d"/>
    <language>en</language>
    <item>
      <title>CRUD Operations in MongoDB Atlas – A Beginner’s Guide with Student Database Example</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Mon, 06 Oct 2025 04:29:52 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-2nkn</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/crud-operations-in-mongodb-atlas-a-beginners-guide-with-student-database-example-2nkn</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": "Devi",&lt;br&gt;
"age": 20,&lt;br&gt;
"department": "CSBS",&lt;br&gt;
"year": 2,&lt;br&gt;
"cgpa": 8.1&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
"student_id": "02",&lt;br&gt;
"name": "Reshma",&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: "Devi",&lt;br&gt;
age: 20,&lt;br&gt;
department: "CSBS",&lt;br&gt;
year: 2,&lt;br&gt;
cgpa: 8.1&lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
student_id: "02",&lt;br&gt;
name: "Reshma",&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%2F02ccxmnoils2q1xy1oiu.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%2F02ccxmnoils2q1xy1oiu.png" alt=" " width="800" height="394"&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>programming</category>
      <category>mongodb</category>
      <category>sql</category>
    </item>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization in DBMS</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Sun, 05 Oct 2025 11:05:19 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/indexing-hashing-query-optimization-in-dbms-965</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/indexing-hashing-query-optimization-in-dbms-965</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%2Fndfm0oziocybnrihx8ov.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%2Fndfm0oziocybnrihx8ov.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%2Fups3bhvro5521lic6ue8.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%2Fups3bhvro5521lic6ue8.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%2F704t3usli8f7kipmssfr.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%2F704t3usli8f7kipmssfr.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%2F47xa03cwzxfe9dgaljl9.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%2F47xa03cwzxfe9dgaljl9.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%2Fst74rdd1n2g96owmp6i4.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%2Fst74rdd1n2g96owmp6i4.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%2Fvvv2cw6surs9pjotig55.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%2Fvvv2cw6surs9pjotig55.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%2Ff7n1jzerj0zf5m2r8udn.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%2Ff7n1jzerj0zf5m2r8udn.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%2F2yza7bvyhj585nuhbgkn.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%2F2yza7bvyhj585nuhbgkn.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>programming</category>
      <category>learning</category>
      <category>database</category>
      <category>coding</category>
    </item>
    <item>
      <title>DBMS - Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:54:48 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/dbms-transactions-deadlocks-log-based-recovery-4173</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/dbms-transactions-deadlocks-log-based-recovery-4173</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%2F9z9paqmgyvyfepvr6mnd.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%2F9z9paqmgyvyfepvr6mnd.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%2Fyozvg4oavnek8jb11t9l.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%2Fyozvg4oavnek8jb11t9l.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%2Fcyq7kehjppg298q8de8o.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%2Fcyq7kehjppg298q8de8o.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%2F3q3s3ie5dvilu4gb5z9r.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%2F3q3s3ie5dvilu4gb5z9r.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;&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%2Fqalknjz2u3haezjedywa.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%2Fqalknjz2u3haezjedywa.webp" alt=" " width="800" height="401"&gt;&lt;/a&gt; &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%2Fb77ybhywmxl128jncpfm.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%2Fb77ybhywmxl128jncpfm.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%2Fwayznnt3yhg7j6c30pg7.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%2Fwayznnt3yhg7j6c30pg7.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%2Fnxh1qcr14v5by03vzlo1.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%2Fnxh1qcr14v5by03vzlo1.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%2Fhgi0r6dmxm08bdt6egmo.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%2Fhgi0r6dmxm08bdt6egmo.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%2Fmvnasm23hjl6pcmnvyvn.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%2Fmvnasm23hjl6pcmnvyvn.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%2Fbgze1n2u9shp3yinuq9z.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%2Fbgze1n2u9shp3yinuq9z.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>database</category>
      <category>learning</category>
    </item>
    <item>
      <title>ACID Properties with SQL Transactions in DBMS</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:46:37 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/acid-properties-with-sql-transactions-in-dbms-2g5l</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/acid-properties-with-sql-transactions-in-dbms-2g5l</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%2Fd734cwb5ijow1au29eip.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%2Fd734cwb5ijow1au29eip.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%2Fcsy614nx4lbxsepgj9av.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%2Fcsy614nx4lbxsepgj9av.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%2Fd40assb3nd71zvj8q4xc.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%2Fd40assb3nd71zvj8q4xc.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%2Fabveabwn0cwhtm6h25d6.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%2Fabveabwn0cwhtm6h25d6.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%2Fgm1z50b3uossqjr2sdpw.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%2Fgm1z50b3uossqjr2sdpw.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%2F65adz5f21s8ky4oabrjg.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%2F65adz5f21s8ky4oabrjg.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%2F8p774423vdc1hiqdewb2.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%2F8p774423vdc1hiqdewb2.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%2Fweenpsogx3by5ucq8bjm.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%2Fweenpsogx3by5ucq8bjm.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%2Fztrjdzllgpz9pqj7rnlc.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%2Fztrjdzllgpz9pqj7rnlc.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%2Frzav756u209tgc8y0elf.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%2Frzav756u209tgc8y0elf.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%2F26x7yv35cnmzewoi1ypv.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%2F26x7yv35cnmzewoi1ypv.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%2Fs82uj4yjotu5lcel9bi6.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%2Fs82uj4yjotu5lcel9bi6.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%2Fed36ebx82xlma44jxqi4.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%2Fed36ebx82xlma44jxqi4.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>database</category>
      <category>sql</category>
      <category>learning</category>
    </item>
    <item>
      <title>Cursor and Trigger in DBMS</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:38:25 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/cursor-and-trigger-in-dbms-4pp2</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/cursor-and-trigger-in-dbms-4pp2</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%2F9cf74w5pss16kh5mqux0.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%2F9cf74w5pss16kh5mqux0.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%2F3js8xo4ir9bzrccxy876.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%2F3js8xo4ir9bzrccxy876.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%2Fm82l1zu4vzocfl74i1z6.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%2Fm82l1zu4vzocfl74i1z6.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%2Fb83r2exjvgjkz88lhnp4.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%2Fb83r2exjvgjkz88lhnp4.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%2Fo4jsevynhzsqr9xtqve0.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%2Fo4jsevynhzsqr9xtqve0.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%2Fid9f4xzspj5yqr0pgdpd.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%2Fid9f4xzspj5yqr0pgdpd.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%2Fp0l43x6qifxflkbh7rmf.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%2Fp0l43x6qifxflkbh7rmf.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%2Fxr5c4vhp8lfyly4zghfz.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%2Fxr5c4vhp8lfyly4zghfz.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>sql</category>
      <category>learning</category>
      <category>database</category>
    </item>
    <item>
      <title>Database Normalization</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:22:55 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/database-normalization-5213</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/database-normalization-5213</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%2Fluwnffzchqy5kaekeq00.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%2Fluwnffzchqy5kaekeq00.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%2Fqyh0m2nwiov2k8eb82mo.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%2Fqyh0m2nwiov2k8eb82mo.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%2Fwme3qab45v4rbhl801vw.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%2Fwme3qab45v4rbhl801vw.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%2Fbd76xp8wkupj849zvv2a.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%2Fbd76xp8wkupj849zvv2a.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%2Fiiy4mddv2k887f06u5xx.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%2Fiiy4mddv2k887f06u5xx.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%2Fic1vb6fae79tenc5x53k.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%2Fic1vb6fae79tenc5x53k.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%2Fxn3lo8rj6x242g1ehb9g.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%2Fxn3lo8rj6x242g1ehb9g.webp" alt=" " width="800" height="380"&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%2Fvh5omsygr8fpdd1w9b3x.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%2Fvh5omsygr8fpdd1w9b3x.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%2Fumhd6ypc0hfx6so46bf7.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%2Fumhd6ypc0hfx6so46bf7.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%2F2ybshmdvh80tuhornbwu.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%2F2ybshmdvh80tuhornbwu.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; Sir 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>coding</category>
    </item>
    <item>
      <title>Student Managment System</title>
      <dc:creator>Reshma Devi</dc:creator>
      <pubDate>Mon, 01 Sep 2025 10:05:21 +0000</pubDate>
      <link>https://dev.to/reshma_devi_ba32b2f54397d/student-managment-system-28kp</link>
      <guid>https://dev.to/reshma_devi_ba32b2f54397d/student-managment-system-28kp</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%2Fvey1bgp7zk7gt0h4i55x.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%2Fvey1bgp7zk7gt0h4i55x.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%2Frf3mad5dqkh7pqrh3m2z.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%2Frf3mad5dqkh7pqrh3m2z.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%2Fgwbet4633bqny4mbtoho.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%2Fgwbet4633bqny4mbtoho.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&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%2Fygsrawqtue7i9ixfcqnw.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%2Fygsrawqtue7i9ixfcqnw.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%2F74vdgvtyjy2e6dcsquqc.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%2F74vdgvtyjy2e6dcsquqc.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

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