<?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: HARI SARAVANAN</title>
    <description>The latest articles on Forem by HARI SARAVANAN (@hari_saravanan_7ddd3f0bbf).</description>
    <link>https://forem.com/hari_saravanan_7ddd3f0bbf</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%2F3449058%2Fe54d6e19-c094-4e20-8533-e420a4e82f09.png</url>
      <title>Forem: HARI SARAVANAN</title>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hari_saravanan_7ddd3f0bbf"/>
    <language>en</language>
    <item>
      <title>AWS SERVICES SPOTLIGHT : CLOUDHSM (HARDWARD SECURITY MODULE)</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 18 Dec 2025 14:49:46 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/aws-services-spotlight-cloudhsm-hardward-security-module-mbm</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/aws-services-spotlight-cloudhsm-hardward-security-module-mbm</guid>
      <description>&lt;p&gt;SERVICE OVERVIEW:&lt;/p&gt;

&lt;p&gt;AWS CloudHSM is a cloud-based Hardware Security Module (HSM) service that enables organizations to generate, store, and manage cryptographic keys inside tamper-resistant hardware.&lt;br&gt;
It helps meet strict security, compliance, and regulatory requirements by ensuring full control over encryption keys.&lt;/p&gt;

&lt;p&gt;KEY-FEATURES:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dedicated HSM instances (single-tenant)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FIPS 140-2 Level 3 compliant security&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Secure key generation, storage, and management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full customer control over encryption keys&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supports industry-standard APIs (PKCS#11, JCE, OpenSSL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;High availability using HSM clusters&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS CATEGORY/CLOUD DOMAIN:&lt;/p&gt;

&lt;p&gt;Security, Identity &amp;amp; Compliance&lt;/p&gt;

&lt;p&gt;WHERE IT FITS IN CLOUD/DEVOPS LIFECYCLE:&lt;/p&gt;

&lt;p&gt;AWS CloudHSM fits into the Security &amp;amp; Compliance phase of the Cloud and DevSecOps lifecycle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In DevSecOps pipelines, CloudHSM is used for:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Secure key management for encryption &amp;amp; decryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Digital signing of code and certificates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Protecting sensitive data in databases, applications, and containers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meeting compliance requirements (PCI-DSS, HIPAA, financial regulations)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 CloudHSM ensures security is embedded, not added later.&lt;/p&gt;

&lt;p&gt;PROGRAMMING LANGUAGE/ACCESS METHOD:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AWS CloudHSM is accessed using:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PKCS#11&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java Cryptography Extensions (JCE)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenSSL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS SDKs and CLI for management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supported languages include:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C / C++&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PRICING MODEL:&lt;/p&gt;

&lt;p&gt;AWS CloudHSM follows a pay-as-you-go pricing model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Charged per HSM instance per hour&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Additional costs for backup and data transfer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No upfront commitments&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Ideal for enterprises that need maximum security with flexible scaling.&lt;/p&gt;

&lt;p&gt;WHYCLOUDHSM MTTER IN DEVOPS:&lt;/p&gt;

&lt;p&gt;“If your keys are compromised, your security is compromised.”&lt;/p&gt;

&lt;p&gt;CloudHSM provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Strong cryptographic isolation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customer-owned key control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hardware-level trust for cloud workloads&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>cloud</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>DEVOPS PERIODIC TABLE AND RULES HT: HASHICORP TERRAFORM</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 18 Dec 2025 14:28:51 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/devops-periodic-table-and-rules-nkd</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/devops-periodic-table-and-rules-nkd</guid>
      <description>&lt;p&gt;HASHICORP TERRAFORM&lt;/p&gt;

&lt;p&gt;OVERVIEW OF THE TOOL: &lt;br&gt;
                     HashiCorp Terraform is an Infrastructure as Code (IaC) tool that allows developers and DevOps engineers to define, provision, and manage cloud infrastructure using code.&lt;br&gt;
It enables consistent, repeatable, and automated infrastructure deployment across multiple cloud providers.&lt;/p&gt;

&lt;p&gt;Terraform treats infrastructure the same way developers treat application code — versioned, reviewed, and automated.&lt;/p&gt;

&lt;p&gt;KEY-FEATURES:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Infrastructure as Code (IaC) using declarative configuration files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-cloud support (AWS, Azure, GCP, Kubernetes, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execution plans to preview infrastructure changes before applying&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State management to track real-world infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reusable modules for standard and scalable infrastructure design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strong ecosystem with thousands of providers and plugins&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HOW IT FIT INTO DEVOPS/DEVSECOPS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Terraform fits into the Infrastructure Provisioning stage of the DevOps and DevSecOps lifecycle.&lt;br&gt;
In a DevSecOps pipeline, Terraform helps by:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enforcing secure-by-default infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enabling policy-as-code (with tools like Sentinel)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reducing human errors through automation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrating seamlessly with CI/CD pipelines (Jenkins, GitHub Actions, GitLab CI)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 In short: Terraform builds the foundation on which secure applications run.&lt;/p&gt;

&lt;p&gt;PROGRAMMING LANGUAGE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Terraform uses HCL (HashiCorp Configuration Language), a declarative language designed to be:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Human-readable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to learn&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Machine-friendly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Terraform also supports JSON syntax and can be integrated using SDKs and APIs&lt;/p&gt;

&lt;p&gt;PARENT COMPANY:&lt;/p&gt;

&lt;p&gt;Terraform is developed and maintained by HashiCorp, a company specializing in cloud infrastructure automation tools.&lt;/p&gt;

&lt;p&gt;OPENSOURCE OR PAID?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Terraform Core → ✅ Open Source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Terraform Enterprise / Terraform Cloud → 💰 Paid (with free tier)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows individuals and startups to start free and scale with enterprise-grade features later&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>developer</category>
    </item>
    <item>
      <title>MONGODB IN ACTION : BUILDING A SMART STUDENT DATABASE WITH CRUD OPERATIONS</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 06 Nov 2025 13:45:05 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/mongodb-in-action-building-a-smart-student-database-with-crud-operations-c86</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/mongodb-in-action-building-a-smart-student-database-with-crud-operations-c86</guid>
      <description>&lt;p&gt;🧩 Short Introduction (for your blog / LinkedIn post)&lt;br&gt;
📘 Introduction&lt;/p&gt;

&lt;p&gt;In this task, I explored how to perform CRUD operations (Create, Read, Update, Delete) using MongoDB, a popular NoSQL database that stores data in JSON-like documents.&lt;/p&gt;

&lt;p&gt;MongoDB is flexible and schema-less, making it perfect for applications where data structure can evolve over time.&lt;br&gt;
To understand how it works, I created a simple students collection to manage college student records, and performed all CRUD operations step-by-step.&lt;br&gt;
🏗️ Step 1: Create Collection &amp;amp; Insert Documents&lt;br&gt;
db.students.insertMany([&lt;br&gt;
  { "student_id": "S001", "name": "Santhosh", "age": 20, "department": "CSBS", "year": 2, "cgpa": 9.0 },&lt;br&gt;
  { "student_id": "S002", "name": "Priya", "age": 21, "department": "IT", "year": 3, "cgpa": 8.7 },&lt;br&gt;
  { "student_id": "S003", "name": "Ravi", "age": 22, "department": "ECE", "year": 4, "cgpa": 7.3 },&lt;br&gt;
  { "student_id": "S004", "name": "Meena", "age": 19, "department": "CSBS", "year": 1, "cgpa": 9.2 },&lt;br&gt;
  { "student_id": "S005", "name": "Vikram", "age": 20, "department": "MECH", "year": 2, "cgpa": 8.1 }&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%2Fe46z27yzhogcnrj9zex7.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%2Fe46z27yzhogcnrj9zex7.png" alt=" " width="797" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔍 Step 2: Read (Query) Operations&lt;/p&gt;

&lt;p&gt;a) Display all student records&lt;/p&gt;

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

&lt;p&gt;b) 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;c) Find all students from the "CSBS" department&lt;/p&gt;

&lt;p&gt;db.students.find({ department: "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%2F2lyy4rffucolg32k6ab2.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%2F2lyy4rffucolg32k6ab2.png" alt=" " width="273" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✏️ Step 3: Update Operations&lt;/p&gt;

&lt;p&gt;a) Update the CGPA of a specific student (say, S002)&lt;/p&gt;

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

&lt;p&gt;b) Increase the year of all 3rd year students by 1&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;&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%2Fzk42hajndbkovauoye3w.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%2Fzk42hajndbkovauoye3w.png" alt=" " width="270" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗑️ Step 4: Delete Operations&lt;/p&gt;

&lt;p&gt;a) Delete one student by ID&lt;/p&gt;

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

&lt;p&gt;b) Delete all students with CGPA &amp;lt; 7.5&lt;/p&gt;

&lt;p&gt;db.students.deleteMany({ cgpa: { $lt: 7.5 } });&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%2Fnppxytg64jqqv9abi3wm.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%2Fnppxytg64jqqv9abi3wm.png" alt=" " width="464" height="812"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📤 Step 5: Export Final Collection&lt;/p&gt;

&lt;p&gt;Export as JSON:&lt;/p&gt;

&lt;p&gt;mongoexport --uri="your_connection_URI" --collection=students --out=students.json&lt;/p&gt;

&lt;p&gt;Export as CSV:&lt;/p&gt;

&lt;p&gt;mongoexport --uri="your_connection_URI" --collection=students --type=csv --fields=student_id,name&lt;/p&gt;

&lt;p&gt;💡 Introduction&lt;/p&gt;

&lt;p&gt;(Use the short intro above)&lt;/p&gt;

&lt;p&gt;🏗️ Creating the Database &amp;amp; Collection&lt;/p&gt;

&lt;p&gt;(Code + screenshot)&lt;/p&gt;

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

&lt;p&gt;(Code + screenshot)&lt;/p&gt;

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

&lt;p&gt;(Code + screenshots for all queries)&lt;/p&gt;

&lt;p&gt;✏️ Update Operation&lt;/p&gt;

&lt;p&gt;(Code + before/after screenshots)&lt;/p&gt;

&lt;p&gt;🗑️ Delete Operation&lt;/p&gt;

&lt;p&gt;(Code + before/after screenshots)&lt;/p&gt;

&lt;p&gt;📤 Exporting Data&lt;/p&gt;

&lt;p&gt;(Show final JSON/CSV file)&lt;/p&gt;

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

&lt;p&gt;CRUD operations in MongoDB are simple yet powerful.&lt;br&gt;
They form the foundation of most modern NoSQL-based applications.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>database</category>
      <category>beginners</category>
    </item>
    <item>
      <title>DATABASE NORMALIZATION IN SQL - 1NF,2NF AND 3NF EXPLAINED (STUDENT - COURSE CASE STUDY</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 06 Nov 2025 12:22:50 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/database-normalization-in-sql-1nf2nf-and-3nf-explained-student-course-case-study-3b2c</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/database-normalization-in-sql-1nf2nf-and-3nf-explained-student-course-case-study-3b2c</guid>
      <description>&lt;p&gt;📘 Introduction&lt;/p&gt;

&lt;p&gt;Database Normalization is the process of organizing data in a database to reduce redundancy and avoid data anomalies (insertion, update, and deletion problems).&lt;/p&gt;

&lt;p&gt;It divides a large, unorganized table into smaller, related tables — ensuring data consistency and integrity.&lt;/p&gt;

&lt;p&gt;The most common normal forms are:&lt;/p&gt;

&lt;p&gt;1NF (First Normal Form): Remove repeating groups and ensure each cell holds a single value.&lt;/p&gt;

&lt;p&gt;2NF (Second Normal Form): Remove partial dependency — every non-key attribute depends on the whole primary key.&lt;/p&gt;

&lt;p&gt;3NF (Third Normal Form): Remove transitive dependency — non-key attributes should not depend on other non-key attributes.&lt;/p&gt;

&lt;p&gt;Normalization makes your database cleaner, faster, and easier to maintain.&lt;/p&gt;

&lt;p&gt;⚠️ Step 1: Identify Anomalies&lt;/p&gt;

&lt;p&gt;Insertion Anomaly: Can’t insert a new course unless a student takes it.&lt;br&gt;
Update Anomaly: If an instructor changes name, you must update multiple rows.&lt;br&gt;
Deletion Anomaly: If Alice drops a course, you might lose information about that course’s instructor&lt;/p&gt;

&lt;p&gt;✅ Step 2: Convert to 1NF (First Normal Form)&lt;/p&gt;

&lt;p&gt;👉 Rule: Remove repeating groups — each column must have atomic (single) values.&lt;/p&gt;

&lt;p&gt;The table already satisfies 1NF since all columns have atomic values.&lt;br&gt;
Let’s write the SQL:&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%2F8hse0kxkzd266owd7crn.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%2F8hse0kxkzd266owd7crn.png" alt=" " width="682" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Step 3: Convert to 2NF (Second Normal Form)&lt;/p&gt;

&lt;p&gt;👉 Rule: Remove partial dependency — every non-key attribute must depend on the entire primary key.&lt;/p&gt;

&lt;p&gt;Here, the composite key is (StudentID, CourseID).&lt;br&gt;
But StudentName depends only on StudentID, and CourseName and InstructorName depend only on CourseID.&lt;/p&gt;

&lt;p&gt;So we split the table into three:&lt;/p&gt;

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

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

&lt;p&gt;3️⃣ Enrollments&lt;br&gt;
CREATE TABLE Enrollments (&lt;br&gt;
  StudentID INT,&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  PRIMARY KEY (StudentID, 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%2Fpjuj3umpp3ik2r2a2o65.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%2Fpjuj3umpp3ik2r2a2o65.png" alt=" " width="455" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Step 4: Convert to 3NF (Third Normal Form)&lt;/p&gt;

&lt;p&gt;👉 Rule: Remove transitive dependency — non-key columns shouldn’t depend on other non-key columns.&lt;/p&gt;

&lt;p&gt;In Courses, InstructorName depends on CourseID (which is fine), but if one instructor teaches multiple courses, that’s repetition.&lt;br&gt;
So we create a separate Instructors table.&lt;/p&gt;

&lt;p&gt;1️⃣ Instructors&lt;br&gt;
CREATE TABLE Instructors (&lt;br&gt;
  InstructorID INT PRIMARY KEY,&lt;br&gt;
  InstructorName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;2️⃣ Update Courses to include a foreign key&lt;br&gt;
CREATE TABLE Courses_3NF (&lt;br&gt;
  CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  InstructorID INT,&lt;br&gt;
  FOREIGN KEY (InstructorID) REFERENCES Instructors(InstructorID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;3️⃣ Students and Enrollments remain same&lt;br&gt;
CREATE TABLE Students_3NF (&lt;br&gt;
  StudentID INT PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments_3NF (&lt;br&gt;
  StudentID INT,&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
  FOREIGN KEY (StudentID) REFERENCES Students_3NF(StudentID),&lt;br&gt;
  FOREIGN KEY (CourseID) REFERENCES Courses_3NF(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%2Fcl3xbth28zxvf5wg5kpv.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%2Fcl3xbth28zxvf5wg5kpv.png" alt=" " width="686" height="688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Step 5: Insert Sample Data&lt;br&gt;
INSERT INTO Instructors VALUES&lt;br&gt;
(1, 'Dr. Kumar'),&lt;br&gt;
(2, 'Dr. Meena'),&lt;br&gt;
(3, 'Dr. Ravi');&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses_3NF VALUES&lt;br&gt;
('C101', 'DBMS', 1),&lt;br&gt;
('C102', 'OS', 2),&lt;br&gt;
('C103', 'Networks', 3);&lt;/p&gt;

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

&lt;p&gt;INSERT INTO Enrollments_3NF VALUES&lt;br&gt;
(1, 'C101'),&lt;br&gt;
(2, 'C102'),&lt;br&gt;
(1, 'C102'),&lt;br&gt;
(3, '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%2Fsgty2h9oct7k37mt2r9f.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%2Fsgty2h9oct7k37mt2r9f.png" alt=" " width="650" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Step 6: Query to List All Students with Courses and Instructors&lt;br&gt;
SELECT s.StudentName, c.CourseName, i.InstructorName&lt;br&gt;
FROM Enrollments_3NF e&lt;br&gt;
JOIN Students_3NF s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Courses_3NF c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructors i ON c.InstructorID = i.InstructorID;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbztkg0vdokbhi3rp4lxc.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%2Fbztkg0vdokbhi3rp4lxc.png" alt=" " width="800" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Introduction&lt;/p&gt;

&lt;p&gt;(Use the short intro above)&lt;/p&gt;

&lt;p&gt;⚙️ Base Table &amp;amp; Anomalies&lt;/p&gt;

&lt;p&gt;(Show sample table + insertion/update/deletion anomalies)&lt;/p&gt;

&lt;p&gt;🧱 1NF&lt;/p&gt;

&lt;p&gt;(Code + screenshot)&lt;/p&gt;

&lt;p&gt;🔗 2NF&lt;/p&gt;

&lt;p&gt;(Code + screenshots of separate tables)&lt;/p&gt;

&lt;p&gt;🌿 3NF&lt;/p&gt;

&lt;p&gt;(Code + screenshots of normalized tables)&lt;/p&gt;

&lt;p&gt;🧮 Final JOIN Query&lt;/p&gt;

&lt;p&gt;(Show combined result table)&lt;/p&gt;

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

&lt;p&gt;Normalization removes redundancy, ensures data consistency, and improves data integrity.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>performance</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>INDEXING,HASHING &amp; QUERY OPTIMIZATION IN SQL (EXAMPLE ON STUDENTS TABLE )</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 06 Nov 2025 12:07:50 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/indexinghashing-query-optimization-in-sql-example-on-students-table--4inh</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/indexinghashing-query-optimization-in-sql-example-on-students-table--4inh</guid>
      <description>&lt;p&gt;📘 Introduction&lt;/p&gt;

&lt;p&gt;In databases, indexing and hashing are techniques used to improve the speed of data retrieval operations. Without indexes, the database must scan every row to find a match, which is slow for large tables.&lt;/p&gt;

&lt;p&gt;B-Tree Index: Used for range and equality queries (e.g., searching roll numbers or CGPAs).&lt;/p&gt;

&lt;p&gt;B+ Tree Index: A variation of B-Tree that stores data only in leaf nodes, providing faster sequential access.&lt;/p&gt;

&lt;p&gt;Hash Index: Used for exact match lookups (e.g., searching by department name).&lt;/p&gt;

&lt;p&gt;Query Optimization ensures that the database uses the most efficient way to execute SQL queries — often by choosing the right index.&lt;/p&gt;

&lt;p&gt;Step 1: Create Table&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
  roll_no INT PRIMARY KEY,&lt;br&gt;
  name VARCHAR(50),&lt;br&gt;
  dept VARCHAR(10),&lt;br&gt;
  cgpa DECIMAL(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%2F9wdto4x9usooptqmela5.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%2F9wdto4x9usooptqmela5.png" alt=" " width="681" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Insert 20 Sample Records&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%2F03n3o79ox8e0i25ios5q.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%2F03n3o79ox8e0i25ios5q.png" alt=" " width="328" height="520"&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%2Fbl2jtbixla1nnrj0cuoc.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%2Fbl2jtbixla1nnrj0cuoc.png" alt=" " width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Create B-Tree Index on&lt;br&gt;
EXPLAIN SELECT * FROM Students 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%2Ftkk7v2gmih833r113kgv.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%2Ftkk7v2gmih833r113kgv.png" alt=" " width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Fetch details of student with roll_no = 110&lt;br&gt;
EXPLAIN SELECT * FROM Students WHERE roll_no = 110;&lt;/p&gt;

&lt;p&gt;✅ The EXPLAIN keyword shows how the query uses the index &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%2F9zws9cpnx501oem5b1h7.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%2F9zws9cpnx501oem5b1h7.png" alt=" " width="686" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Create B+ Tree Index on cgpa&lt;/p&gt;

&lt;p&gt;In MySQL, normal indexes use B+ Tree structure internally.&lt;br&gt;
So the syntax is the same:&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_cgpa ON Students(cgpa);&lt;/p&gt;

&lt;p&gt;Then query:&lt;/p&gt;

&lt;p&gt;EXPLAIN SELECT * FROM Students 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%2Fvhzgih90s4uqngp7xt51.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%2Fvhzgih90s4uqngp7xt51.png" alt=" " width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Create Hash Index on dept&lt;/p&gt;

&lt;p&gt;⚠️ Note: MySQL supports Hash Index only on MEMORY (HEAP) tables, or in PostgreSQL using USING HASH.&lt;/p&gt;

&lt;p&gt;✅ For MySQL:&lt;br&gt;
CREATE INDEX idx_dept USING HASH ON Students(dept);&lt;/p&gt;

&lt;p&gt;✅ For PostgreSQL:&lt;br&gt;
CREATE INDEX idx_dept_hash ON Students USING HASH (dept);&lt;/p&gt;

&lt;p&gt;Step 7: Retrieve students from ‘CSBS’ department&lt;br&gt;
EXPLAIN SELECT * FROM Students 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%2F42ugufvt11ok7picqy7a.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%2F42ugufvt11ok7picqy7a.png" alt=" " width="800" height="727"&gt;&lt;/a&gt;&lt;br&gt;
💡 Introduction&lt;/p&gt;

&lt;p&gt;Explain indexing, hashing, and optimization (use the intro above).&lt;/p&gt;

&lt;p&gt;🧱 Table Creation and Data Insertion&lt;/p&gt;

&lt;p&gt;(Include screenshot of all students.)&lt;/p&gt;

&lt;p&gt;🌳 B-Tree Index on Roll Number&lt;/p&gt;

&lt;p&gt;(Include query + EXPLAIN screenshot.)&lt;/p&gt;

&lt;p&gt;🌲 B+ Tree Index on CGPA&lt;/p&gt;

&lt;p&gt;(Show query + EXPLAIN output for cgpa &amp;gt; 8.0.)&lt;/p&gt;

&lt;p&gt;🧩 Hash Index on Department&lt;/p&gt;

&lt;p&gt;(Show query + EXPLAIN output for ‘CSBS’ department.)&lt;/p&gt;

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

&lt;p&gt;Mention how indexes reduce the time for searching records.&lt;/p&gt;

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

&lt;p&gt;Indexes and hashing make data retrieval much faster and efficient by avoiding full table scans.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>performance</category>
      <category>database</category>
      <category>learning</category>
    </item>
    <item>
      <title>THE BACKBONE OF DATABASE REALIABILITY: EXPLORING ACID IN ACTION WITH SQL TRANSACTION A STEP-STEP-STEP GUIDE</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 06 Nov 2025 11:10:36 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/the-backbone-of-database-realiability-exploring-acid-in-action-with-sql-transaction-a-1nc1</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/the-backbone-of-database-realiability-exploring-acid-in-action-with-sql-transaction-a-1nc1</guid>
      <description>&lt;p&gt;In database systems, ACID stands for Atomicity, Consistency, Isolation, and Durability. These four key properties ensure that database transactions are processed reliably — even in the case of errors, system crashes, or multiple users accessing the same data at once.&lt;/p&gt;

&lt;p&gt;A transaction is a single logical unit of work that can include one or more SQL operations (like INSERT, UPDATE, or DELETE).&lt;br&gt;
For example, transferring money between two bank accounts involves deducting an amount from one account and adding it to another. Both actions must succeed together — or fail completely — to maintain correctness.&lt;/p&gt;

&lt;p&gt;The ACID properties guarantee this reliability:&lt;/p&gt;

&lt;p&gt;Atomicity: Ensures that all steps in a transaction are treated as one single “all or nothing” operation.&lt;/p&gt;

&lt;p&gt;Consistency: Ensures that the database remains in a valid state before and after the transaction.&lt;/p&gt;

&lt;p&gt;Isolation: Ensures that transactions occurring at the same time do not interfere with each other.&lt;/p&gt;

&lt;p&gt;Durability: Ensures that once a transaction is committed, its changes are permanent, even after a system crash.&lt;/p&gt;

&lt;p&gt;Together, these properties form the foundation of trustworthy database systems, keeping your data accurate and secure.&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;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES&lt;br&gt;
(101, 'Alice', 1000),&lt;br&gt;
(102, 'Bob', 800),&lt;br&gt;
(103, 'Charlie', 1200);&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%2Fnkk5gw6hp08b5d9l2ugm.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%2Fnkk5gw6hp08b5d9l2ugm.png" alt=" " width="666" height="681"&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%2Fan8k3cd71vqzs5lun2h7.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%2Fan8k3cd71vqzs5lun2h7.png" alt=" " width="612" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚙️ Step 2: Demonstrate Atomicity&lt;/p&gt;

&lt;p&gt;Goal: Show that a failed transaction rolls back — no partial update remains&lt;br&gt;
-- Start Transaction&lt;br&gt;
START TRANSACTION;&lt;/p&gt;

&lt;p&gt;-- Alice sends 500 to Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 500 WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;-- Bob receives 500&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 102;&lt;/p&gt;

&lt;p&gt;-- Simulate an error or rollback&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;-- Check balances again&lt;br&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%2Flklbs5bu36d3criyn1m9.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%2Flklbs5bu36d3criyn1m9.png" alt=" " width="800" height="188"&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%2Fs0fbxbrr8iqjquy4zq7l.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%2Fs0fbxbrr8iqjquy4zq7l.png" alt=" " width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explanation:&lt;br&gt;
After rollback, balances of Alice and Bob should remain the same (1000 and 800).&lt;br&gt;
That shows Atomicity — either all steps complete or none do.&lt;/p&gt;

&lt;p&gt;Step 3: Demonstrate Consistency&lt;/p&gt;

&lt;p&gt;Goal: Database rules prevent invalid data.&lt;/p&gt;

&lt;p&gt;Try to insert a record with a negative balance:&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES (104, 'David', -500);&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%2Fonjo45ypryyrxaw5pyud.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%2Fonjo45ypryyrxaw5pyud.png" alt=" " width="530" height="52"&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%2Finvfgc8v0odo9ykkcf0k.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%2Finvfgc8v0odo9ykkcf0k.png" alt=" " width="442" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Demonstrate Isolation&lt;/p&gt;

&lt;p&gt;Goal: Two sessions should not interfere.&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 1000 WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;2️⃣ Session 2 (in another SQL tab/window)&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 101;&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%2Fzdvbot7akrrak47sanyt.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%2Fzdvbot7akrrak47sanyt.png" alt=" " width="703" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 Step 5: Demonstrate Durability&lt;/p&gt;

&lt;p&gt;Goal: Data persists even after DB restart.&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 200 WHERE acc_no = 103;&lt;br&gt;
COMMIT;&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
This experiment shows how ACID ensures reliability in SQL transactions — no data loss, corruption, or interference.&lt;/p&gt;

</description>
      <category>database</category>
      <category>learning</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Transactions,Deadlocks &amp; Log Based Recovery</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Thu, 09 Oct 2025 07:25:38 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/transactionsdeadlocks-log-based-recovery-38lp</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/transactionsdeadlocks-log-based-recovery-38lp</guid>
      <description>&lt;p&gt;1.Transaction, Atomicity, and Rollback&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A transaction is a sequence of operations performed as a single logical unit of work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Atomicity means either all operations complete successfully, or none do (if something fails or you rollback).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rollback means to undo all operations in the transaction if it is not committed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.Deadlocks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deadlocks happen when two transactions each hold locks on resources the other needs, and neither can proceed, causing a standstill.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Databases keep logs of all transactions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These logs help undo (rollback) or redo operations if needed, ensuring data consistency and recovery after crashes.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 1: Setup Your Environment with the Accounts Table&lt;br&gt;
Create the table:&lt;/p&gt;

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

&lt;p&gt;Insert initial data:&lt;/p&gt;

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

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

&lt;p&gt;Step 2: Transaction – Atomicity &amp;amp; Rollback&lt;br&gt;
Start a transaction.&lt;/p&gt;

&lt;p&gt;Transfer 500 from Alice (acc_no=1) to Bob (acc_no=2).&lt;/p&gt;

&lt;p&gt;Before committing, rollback the transaction.&lt;/p&gt;

&lt;p&gt;Check balances to confirm no partial update (Alice and Bob's balances unchanged).&lt;/p&gt;

&lt;p&gt;BEGIN TRANSACTION;&lt;/p&gt;

&lt;p&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;/p&gt;

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

&lt;p&gt;Step 3: Deadlock Simulation&lt;br&gt;
You need two separate database sessions (tools like MySQL Workbench or psql can open multiple connections).&lt;/p&gt;

&lt;p&gt;Session 1:&lt;br&gt;
BEGIN;&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 1 FOR UPDATE;  -- lock Alice's account&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE acc_no = 2;  -- try to update Bob's account&lt;br&gt;
-- wait or hold here before committing&lt;/p&gt;

&lt;p&gt;BEGIN;&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 2 FOR UPDATE;  -- lock Bob's account&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE acc_no = 1;  -- try to update Alice's account&lt;br&gt;
-- observe deadlock happens here or waits indefinitely&lt;/p&gt;

&lt;p&gt;Deadlock occurs because each session waits for the other to release their lock.&lt;/p&gt;

&lt;p&gt;Step 4: Log-Based Recovery&lt;br&gt;
Ensure logging is enabled in your database (default in MySQL binary log or PostgreSQL WAL).&lt;/p&gt;

&lt;p&gt;Start a transaction to update a record.&lt;/p&gt;

&lt;p&gt;Rollback the transaction.&lt;/p&gt;

&lt;p&gt;Check the log files or use database tools to confirm the undo was logged.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>Cursor And Trigger In DBMS</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Wed, 08 Oct 2025 14:05:13 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/cursor-and-trigger-in-dbms-417n</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/cursor-and-trigger-in-dbms-417n</guid>
      <description>&lt;p&gt;Sql Database&lt;/p&gt;

&lt;p&gt;Tutorial&lt;/p&gt;

&lt;p&gt;STEP:1 Create A Sample Table&lt;br&gt;
CREATE TABLE Employee (&lt;br&gt;
    emp_id NUMBER PRIMARY KEY,&lt;br&gt;
    emp_name VARCHAR2(50),&lt;br&gt;
    salary NUMBER&lt;br&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%2F1aiwyd9sjwvc6ct7p77m.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%2F1aiwyd9sjwvc6ct7p77m.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Insert the Record&lt;br&gt;
INSERT INTO Employee VALUES (1, 'John Doe', 60000);&lt;br&gt;
INSERT INTO Employee VALUES (2, 'Jane Smith', 48000);&lt;br&gt;
INSERT INTO Employee VALUES (3, 'Emily Davis', 52000);&lt;br&gt;
COMMIT;&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%2Fusq4cs9fa19mi3v2bs9l.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%2Fusq4cs9fa19mi3v2bs9l.png" alt=" " width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Write A cursor Program&lt;br&gt;
CREATE OR REPLACE TRIGGER trg_student_audit&lt;br&gt;
AFTER INSERT ON Students&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO Student_Audit (audit_id, student_id, action, log_time)&lt;br&gt;
    VALUES (student_audit_seq.NEXTVAL, :NEW.student_id, 'INSERT', SYSTIMESTAMP);&lt;br&gt;
END;&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%2F2jfknx4g84j7cave5c0m.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%2F2jfknx4g84j7cave5c0m.png" alt=" " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TRIGGER EXAMPLES&lt;/p&gt;

&lt;p&gt;Step 4: Create An Audit Table&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
    student_id NUMBER PRIMARY KEY,&lt;br&gt;
    student_name VARCHAR2(50),&lt;br&gt;
    course VARCHAR2(30)&lt;br&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%2Fnx4zxzf04yzu9dcklkjt.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%2Fnx4zxzf04yzu9dcklkjt.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step:5 Create A Trigger&lt;br&gt;
CREATE TABLE Student_Audit (&lt;br&gt;
    audit_id NUMBER PRIMARY KEY,&lt;br&gt;
    student_id NUMBER,&lt;br&gt;
    action VARCHAR2(20),&lt;br&gt;
    log_time TIMESTAMP&lt;br&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%2F51ykv0xvg5h7hycsyktv.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%2F51ykv0xvg5h7hycsyktv.png" alt=" " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Test A Trigger&lt;br&gt;
CREATE SEQUENCE student_audit_seq START WITH 1 INCREMENT BY 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%2F4ap6j9pue855xxwchm4r.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%2F4ap6j9pue855xxwchm4r.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
This tutorial showed how to use a cursor to process conditional data and how to automate audit logging using an AFTER INSERT trigger in Oracle SQL. Try running these examples yourself on Oracle Live SQL, and customize the logic for your own applications!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>sql</category>
      <category>discuss</category>
    </item>
    <item>
      <title>College Student &amp; Course Management System</title>
      <dc:creator>HARI SARAVANAN</dc:creator>
      <pubDate>Mon, 25 Aug 2025 16:54:59 +0000</pubDate>
      <link>https://forem.com/hari_saravanan_7ddd3f0bbf/college-student-course-management-system-fmo</link>
      <guid>https://forem.com/hari_saravanan_7ddd3f0bbf/college-student-course-management-system-fmo</guid>
      <description>&lt;p&gt;1️⃣ Creating the Students Table&lt;/p&gt;

&lt;p&gt;I began by creating a Students table with fields for StudentID, StudentName, Dept, and Email.&lt;/p&gt;

&lt;p&gt;StudentID → Primary Key&lt;/p&gt;

&lt;p&gt;StudentName → NOT NULL&lt;/p&gt;

&lt;p&gt;Email → UNIQUE&lt;/p&gt;

&lt;p&gt;📸 Screenshot:&lt;/p&gt;

&lt;p&gt;2️⃣ Inserting Student Records&lt;/p&gt;

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

&lt;p&gt;📸 Screenshot:&lt;/p&gt;

&lt;p&gt;3️⃣ Altering the Table – Adding PhoneNo&lt;/p&gt;

&lt;p&gt;Later, I realized I needed a Phone Number column, so I used the ALTER TABLE command to add a new column that can store a 10-digit phone number.&lt;/p&gt;

&lt;p&gt;📸 Screenshot:&lt;/p&gt;

&lt;p&gt;4️⃣ Adding Constraints to Courses&lt;/p&gt;

&lt;p&gt;To practice constraints, I tried modifying the Courses table so that Credits must be between 1 and 5.&lt;br&gt;
👉 Since my Courses table didn’t exist yet, Oracle threw an error – a reminder to always create the table first!&lt;/p&gt;

&lt;p&gt;📸 Screenshot:&lt;/p&gt;

&lt;p&gt;5️⃣ Creating a View – StudentCoursesView&lt;/p&gt;

&lt;p&gt;Finally, I wrote a query to join Students, Courses, and Enrollments and created a view named StudentCoursesView to display StudentName, CourseName, and Grade.&lt;/p&gt;

&lt;p&gt;📸 Screenshot:&lt;/p&gt;

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