<?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: krithik</title>
    <description>The latest articles on Forem by krithik (@krithik).</description>
    <link>https://forem.com/krithik</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%2F3600280%2Fc751ee3f-c2e7-4fd3-bc42-79aa5fc11ac5.png</url>
      <title>Forem: krithik</title>
      <link>https://forem.com/krithik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/krithik"/>
    <language>en</language>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization in Databases</title>
      <dc:creator>krithik</dc:creator>
      <pubDate>Fri, 07 Nov 2025 05:14:11 +0000</pubDate>
      <link>https://forem.com/krithik/indexing-hashing-query-optimization-in-databases-2ifc</link>
      <guid>https://forem.com/krithik/indexing-hashing-query-optimization-in-databases-2ifc</guid>
      <description>&lt;p&gt;When working with databases, simply storing data isn’t enough — efficient retrieval is essential. As your dataset scales to thousands or millions of entries, poorly optimized queries can slow down your system. Techniques like indexing and hashing are crucial tools to speed up lookups, just like the index section of a book helps you find topics quickly.&lt;/p&gt;

&lt;p&gt;Let’s break down how these work, the differences between them, and when to use each.&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%2Ft55x9opc8183usd004rg.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%2Ft55x9opc8183usd004rg.webp" alt=" " width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What Is an Index?&lt;/p&gt;

&lt;p&gt;An index is a specialized data structure that accelerates access to rows in a database table. Rather than scanning every record to satisfy a query, the database can use the index to “jump” directly to likely matches.&lt;/p&gt;

&lt;p&gt;You can think of it like the index pages in a textbook: they don’t contain the whole content, but lead you to exactly where certain topics are discussed.&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%2Fjlhno3nx4l9153ze525n.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%2Fjlhno3nx4l9153ze525n.webp" alt=" " width="614" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Types of Indexes&lt;br&gt;
• Primary index: Automatically generated on the primary key column.&lt;br&gt;
• Secondary index: Created by the user (or DBA) on non-primary columns to speed up queries.&lt;br&gt;
• Clustering index: Controls how data is physically ordered on storage media.&lt;br&gt;
• Non-clustering (or non-clustered) index: A separate data structure that points to the actual data without rearranging it.&lt;/p&gt;

&lt;p&gt;B-Tree and B+Tree Indexing&lt;/p&gt;

&lt;p&gt;Modern databases often use B-Tree or B+Tree structures:&lt;br&gt;
• In B-Tree, both internal and leaf nodes may hold keys and pointers.&lt;br&gt;
• In B+Tree, internal nodes only keep keys, and all actual data pointers reside in leaf nodes.&lt;br&gt;
• Leaf nodes in a B+Tree are typically linked in sequence, making range queries (e.g. “between”) efficient.&lt;/p&gt;

&lt;p&gt;These tree structures balance depth and breadth so that lookup, insert, and delete operations remain comparatively fast.&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%2F1y3pv5dct4p9b5wymwyn.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%2F1y3pv5dct4p9b5wymwyn.webp" alt=" " width="800" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HASH Indexing&lt;/p&gt;

&lt;p&gt;A hash index works differently. It applies a hash function to the key value and uses the resulting hash to determine which “bucket” the record belongs to.&lt;br&gt;
• Strengths: Ideal for exact-match queries like column = constant.&lt;br&gt;
• Weaknesses: Poor for range-based queries (BETWEEN, &amp;lt;, &amp;gt;, etc.) and sorting operations.&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%2F8txl2vhy44x3dec535u1.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%2F8txl2vhy44x3dec535u1.webp" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because hashing effectively scatters data across buckets without inherent order, it’s not useful when query patterns involve ordering or searching within ranges.&lt;/p&gt;

&lt;p&gt;❌ Not good for:&lt;br&gt;
Range-based queries or sorting operations (like BETWEEN, &amp;lt;, &amp;gt;).&lt;/p&gt;

&lt;p&gt;📘 Use Case: When your application frequently runs exact-match lookups.&lt;/p&gt;

&lt;p&gt;🧾 Example: Students Table&lt;/p&gt;

&lt;p&gt;Let’s create a sample table to see how indexing helps:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
roll_no INT PRIMARY KEY,&lt;br&gt;
name VARCHAR(100),&lt;br&gt;
age INT,&lt;br&gt;
grade CHAR(1)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Step 1: Create Indexes&lt;br&gt;
-- B-Tree index (default)&lt;br&gt;
CREATE INDEX idx_roll_btree ON Students (roll_no);&lt;/p&gt;

&lt;p&gt;-- Hash index (if supported by your DBMS)&lt;br&gt;
CREATE INDEX idx_roll_hash ON Students USING HASH (roll_no);&lt;/p&gt;

&lt;p&gt;Step 2: Run Queries&lt;br&gt;
-- Equality check (best for hash or B-tree)&lt;br&gt;
SELECT * FROM Students WHERE roll_no = 50;&lt;/p&gt;

&lt;p&gt;-- Range query (best for B-tree or B+Tree)&lt;br&gt;
SELECT * FROM Students WHERE roll_no BETWEEN 10 AND 100;&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%2Fuas61vaj6kwbw2d5urpn.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%2Fuas61vaj6kwbw2d5urpn.webp" alt=" " width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 The B-Tree index handles both cases efficiently,&lt;br&gt;
while the hash index excels only in equality lookups.&lt;/p&gt;

&lt;p&gt;📊 When to Use Which Index&lt;br&gt;
Use Case Best Index Reason&lt;br&gt;
Equality lookups (=) Hash or B-Tree Hash is fastest for exact matches&lt;br&gt;
Range queries B-Tree / B+Tree Maintains sorted order&lt;br&gt;
Sequential access B+Tree Linked leaf nodes improve performance&lt;br&gt;
Memory optimization Minimal indexing Too many indexes slow down inserts/updates&lt;br&gt;
⚠️ Important Considerations&lt;/p&gt;

&lt;p&gt;Storage Overhead: Every index consumes additional space.&lt;/p&gt;

&lt;p&gt;Write Performance: More indexes = slower INSERT, UPDATE, DELETE.&lt;/p&gt;

&lt;p&gt;Low-Cardinality Columns: Avoid indexing columns with few unique values (e.g., gender, status).&lt;/p&gt;

&lt;p&gt;Maintenance: Indexes can fragment over time and may need rebuilding.&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%2F45ko1ao8tj01cxoeyk49.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%2F45ko1ao8tj01cxoeyk49.webp" alt=" " width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Indexes are one of the most effective tools for query optimization.&lt;br&gt;
But you can combine them with:&lt;/p&gt;

&lt;p&gt;Query planning: Use EXPLAIN to analyze how queries execute.&lt;/p&gt;

&lt;p&gt;Proper filtering: Avoid SELECT *; fetch only what’s needed.&lt;/p&gt;

&lt;p&gt;Composite indexes: Combine multiple columns in one index for common query patterns.&lt;/p&gt;

&lt;p&gt;✅ Summary&lt;br&gt;
Concept Description&lt;br&gt;
Indexing Data structure for faster lookups&lt;br&gt;
B-Tree / B+Tree Supports ordering and range queries&lt;br&gt;
Hash Indexing Best for equality checks&lt;br&gt;
Query Optimization Uses indexes and execution plans for efficiency&lt;br&gt;
🚀 Final Thoughts&lt;/p&gt;

&lt;p&gt;Efficient indexing and query design are what make large-scale applications fast and reliable.&lt;br&gt;
Understanding how and when to use B-Tree or Hash indexes can significantly improve your database performance.&lt;/p&gt;

&lt;p&gt;Start small — analyze your queries, create the right indexes, and monitor performance.&lt;br&gt;
A few thoughtful indexes can turn your slowest queries into instant results.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>database</category>
      <category>performance</category>
    </item>
    <item>
      <title>Cursor + Trigger</title>
      <dc:creator>krithik</dc:creator>
      <pubDate>Fri, 07 Nov 2025 05:07:44 +0000</pubDate>
      <link>https://forem.com/krithik/cursor-trigger-32g</link>
      <guid>https://forem.com/krithik/cursor-trigger-32g</guid>
      <description>&lt;p&gt;🚀 Using Cursor and Trigger in SQL (with Examples)&lt;br&gt;
In SQL, cursors and triggers are powerful features that allow you to process queries row by row and automate actions when data changes. Let’s learn how to use them with practical examples.&lt;/p&gt;

&lt;p&gt;🔹 Cursor Example: Employees with Salary &amp;gt; 50,000&lt;br&gt;
We want to display employee names whose salary is greater than 50,000 using a cursor.&lt;/p&gt;

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

&lt;p&gt;-- Sample Data&lt;br&gt;
INSERT INTO Employee VALUES (1, 'John', 60000);&lt;br&gt;
INSERT INTO Employee VALUES (2, 'Alice', 45000);&lt;br&gt;
INSERT INTO Employee VALUES (3, 'Bob', 75000);&lt;br&gt;
INSERT INTO Employee VALUES (4, 'Emma', 52000);&lt;/p&gt;

&lt;p&gt;Step 2: Cursor with Condition&lt;/p&gt;

&lt;p&gt;SET SERVEROUTPUT ON;&lt;/p&gt;

&lt;p&gt;DECLARE&lt;br&gt;
v_EmpName Employee.EmpName%TYPE; -- variable to hold employee name&lt;br&gt;
CURSOR emp_cursor IS&lt;br&gt;
SELECT EmpName FROM Employee WHERE Salary &amp;gt; 50000;&lt;br&gt;
BEGIN&lt;br&gt;
OPEN emp_cursor;&lt;br&gt;
LOOP&lt;br&gt;
FETCH emp_cursor INTO v_EmpName;&lt;br&gt;
EXIT WHEN emp_cursor%NOTFOUND;&lt;br&gt;
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_EmpName);&lt;br&gt;
END LOOP;&lt;br&gt;
CLOSE emp_cursor;&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%2F4ehr54gmgypb8katpb50.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%2F4ehr54gmgypb8katpb50.webp" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 Trigger Example: AFTER INSERT on Student Table&lt;br&gt;
Whenever a new student is added, we want to log it automatically into an audit table.&lt;/p&gt;

&lt;p&gt;Step 1: Create Student &amp;amp; Audit Tables&lt;/p&gt;

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

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

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

&lt;p&gt;CREATE OR REPLACE TRIGGER trg_AfterInsert_Student&lt;br&gt;
AFTER INSERT ON Students&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
INSERT INTO Student_Audit (StudentID, ActionTime, ActionPerformed)&lt;br&gt;
VALUES (:NEW.StudentID, SYSTIMESTAMP, 'INSERT');&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;Step 3: Test the Trigger&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (1, 'Mike', 'CSE');&lt;br&gt;
INSERT INTO Students VALUES (2, 'Sophia', 'IT');&lt;/p&gt;

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

&lt;p&gt;🎯 Conclusion&lt;br&gt;
Cursor lets us fetch data row by row and apply conditions.&lt;br&gt;
Trigger automates actions after an event (INSERT/UPDATE/DELETE).&lt;br&gt;
Together, they help in data processing and auditing in real-time.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>NORMALISATION</title>
      <dc:creator>krithik</dc:creator>
      <pubDate>Fri, 07 Nov 2025 05:04:06 +0000</pubDate>
      <link>https://forem.com/krithik/normalisation-4o9i</link>
      <guid>https://forem.com/krithik/normalisation-4o9i</guid>
      <description>&lt;p&gt;Understanding Normalization with SQL – 1NF, 2NF, 3NF&lt;br&gt;
When working with databases, we often face redundancy, inconsistency, and anomalies. Normalization helps solve these issues by organizing data into well-structured tables.&lt;/p&gt;

&lt;p&gt;📌 Base Table (Unnormalized Data)&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%2Fw37w2ya11wurk80ak4an.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%2Fw37w2ya11wurk80ak4an.webp" alt=" " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 Anomalies Identified&lt;br&gt;
Insertion: Cannot add a new course unless a student registers.&lt;br&gt;
Update: Changing instructor name requires multiple updates.&lt;br&gt;
Deletion: Deleting a student may remove course data too.&lt;/p&gt;

&lt;p&gt;✅ First Normal Form (1NF)&lt;br&gt;
We ensure atomic values and primary keys.&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%2Fwqt8fjpnqz8m1ebmbu4j.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%2Fwqt8fjpnqz8m1ebmbu4j.webp" alt=" " width="800" height="501"&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%2Fubws2ww8n6adpf5cwka1.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%2Fubws2ww8n6adpf5cwka1.webp" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Second Normal Form (2NF)&lt;br&gt;
We remove partial dependencies by separating Students and Courses.&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%2Fwqie7u3fdvv1jt9lot4o.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%2Fwqie7u3fdvv1jt9lot4o.webp" alt=" " width="800" height="455"&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%2F2tcyqp3j6eyyo3n9vl0b.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%2F2tcyqp3j6eyyo3n9vl0b.webp" alt=" " width="800" height="455"&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%2F5rf6gltdmvvumz1jdrmt.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%2F5rf6gltdmvvumz1jdrmt.webp" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Third Normal Form (3NF)&lt;br&gt;
We remove transitive dependencies by separating Instructors.&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%2Fdcndd7yhs9teboxalu9l.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%2Fdcndd7yhs9teboxalu9l.webp" alt=" " width="800" height="455"&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%2Fsgbh9x3obgjc1tb5n9yi.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%2Fsgbh9x3obgjc1tb5n9yi.webp" alt=" " width="800" height="455"&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%2F3kdovaqskb3vqgio4e68.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%2F3kdovaqskb3vqgio4e68.webp" alt=" " width="800" height="455"&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%2Fmm99vrfy4lzybnoxy5yv.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%2Fmm99vrfy4lzybnoxy5yv.webp" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📥 Sample Data Insertions&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%2Fifp5nh6v3rm4vg22dk4k.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%2Fifp5nh6v3rm4vg22dk4k.webp" alt=" " width="800" height="455"&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%2Fqcd51osf07mihtx8b98t.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%2Fqcd51osf07mihtx8b98t.webp" alt=" " width="800" height="455"&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%2Fny5igsio8z9pgye604mo.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%2Fny5igsio8z9pgye604mo.webp" alt=" " width="800" height="455"&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%2Fxwxod4e7ctcnyxljlihb.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%2Fxwxod4e7ctcnyxljlihb.webp" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Query with JOINs&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%2Flpr0gri67h1wppr3sspm.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%2Flpr0gri67h1wppr3sspm.webp" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 Conclusion&lt;br&gt;
By applying 1NF → 2NF → 3NF, we eliminated redundancy, prevented anomalies, and achieved a clean database design. This structured design makes querying and maintenance much easier.&lt;/p&gt;

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