DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Related

  • Common Mistakes to Avoid When Writing SQL Code
  • Parquet vs Lance: How Storage Layout Changes the Read Path
  • LangChain With SQL Databases: Natural Language to SQL Queries
  • Resilience Lost in the Stack: How Abstraction Layers Silently Mask Distributed Systems’ Topology Awareness

Trending

  • Bringing AI Agents to Cloud Engineering: How Autonomous Operations Are Changing Reliability at Scale
  • Workflows vs AI Agents vs Multi-Agent Systems: A Practical Guide for Developers
  • Automating Power Automate: How to Ensure Cloud Flows Are Active After Every Pipeline Deployment
  • If You Can Facilitate a Retrospective, You Can Audit Your AI
  1. DZone
  2. Data Engineering
  3. Databases
  4. Database Normalization, ACID Properties, and SCDs: A Comprehensive Guide

Database Normalization, ACID Properties, and SCDs: A Comprehensive Guide

Master database normalization, ACID properties, and Slowly Changing Dimensions (Types 0–3) with practical examples and performance best practices.

By 
arvind toorpu user avatar
arvind toorpu
DZone Core CORE ·
Jul. 10, 26 · Analysis
Likes (0)
Comment
Save
Tweet
Share
61 Views

Join the DZone community and get the full member experience.

Join For Free

Database Normalization: Balancing Structure and Performance

Normalization is a systematic approach to organizing database structures to minimize redundancy and improve data integrity. While theoretical normalization extends to six normal forms, most real-world database implementations target the third normal form (3NF) as the optimal balance between structural integrity and performance.

Benefits and Drawbacks of Normalization

Advantages Disadvantages
Minimizes data redundancy May require complex joins
Prevents update anomalies Can impact query performance
Enhances data consistency May increase development complexity
Reduces storage requirements Requires more tables to represent relationships
Simplifies data maintenance May require more complex indexing strategies


First Normal Form (1NF)

Definition: A table is in 1NF when all columns contain atomic (indivisible) values, and there are no repeating groups.

Key principle: Each column must contain only one value for each row.

Example: Consider a university database tracking student contact information:

Before 1NF (Non-normalized):

StudentID Name Email
S001 John Smith ,
S002 Maria Garcia


The above table violates 1NF because the Email column contains multiple values for student S001.

After 1NF:

Students table:

StudentID Name
S001 John Smith
S002 Maria Garcia


Student emails table:

StudentID Email
S001
S001
S002


This approach resolves the multi-valued attribute issue by creating a separate table for email addresses, ensuring each cell contains exactly one value.

Second Normal Form (2NF)

Definition: A table is in 2NF when it is in 1NF, and all non-key attributes are fully functionally dependent on the primary key.

Key principle: No partial dependencies on a composite primary key.

Example: Consider a database tracking university course enrollments:

In 1NF but not 2NF:

StudentID CourseID CourseName InstructorID InstructorName EnrollmentDate
S001 C101 Database Design I201 Dr. Anderson 2023-01-15
S001 C102 Data Structures I202 Dr. Zhang 2023-01-16
S002 C101 Database Design I201 Dr. Anderson 2023-01-14


The primary key is the composite (StudentID, CourseID), but CourseName depends only on CourseID, not the full primary key. Similarly, InstructorName depends only on InstructorID.

After 2NF:

Enrollments table:

StudentID CourseID EnrollmentDate
S001 C101 2023-01-15
S001 C102 2023-01-16
S002 C101 2023-01-14


Courses table:

CourseID CourseName InstructorID
C101 Database Design I201
C102 Data Structures I202


Instructors table:

InstructorID InstructorName
I201 Dr. Anderson
I202 Dr. Zhang


This design eliminates partial dependencies by creating separate tables for courses and instructors, ensuring all attributes in each table depend on the entire primary key.

Third Normal Form (3NF)

Definition: A table is in 3NF when it is in 2NF, and no non-key attribute depends on another non-key attribute (no transitive dependencies).

Key principle: No transitive dependencies.

Example: Continuing with our university database:

In 2NF but not 3NF:

Courses table:

CourseID CourseName Department DepartmentHead
C101 Database Design Computer Science Dr. Johnson
C102 Data Structures Computer Science Dr. Johnson
C103 Organizational Behavior Business Dr. Williams


Here, DepartmentHead depends on Department, not directly on the primary key CourseID.

After 3NF:

Courses table:

CourseID CourseName DepartmentID
C101 Database Design D001
C102 Data Structures D001
C103 Organizational Behavior D002


Departments table:

DepartmentID Department DepartmentHead
D001 Computer Science Dr. Johnson
D002 Business Dr. Williams


This restructuring eliminates transitive dependencies by creating a separate Departments table.

The APT Mnemonic: Remembering Normal Forms

A simple way to remember the first three normal forms is using the mnemonic APT:

  • A – Atomic values (1NF)
  • P – Partial dependencies eliminated (2NF)
  • T – Transitive dependencies eliminated (3NF)

De-Normalization: When Performance Matters More

De-normalization intentionally introduces redundancy to improve query performance, particularly beneficial for read-heavy analytical workloads.

Key Use Cases

  • Data warehousing
  • Business intelligence systems
  • Reporting applications
  • OLAP (Online Analytical Processing)

Example: Consider a de-normalized sales reporting table:

OrderID CustomerName Region ProductID ProductName Category Quantity UnitPrice TotalAmount OrderDate
O1001 Acme Corp West P101 Server Hardware 2 3000.00 6000.00 2023-03-15
O1002 TechSoft East P102 Database License Software 10 500.00 5000.00 2023-03-16


This single table stores redundant information (like ProductName, Category, etc.) but enables faster reporting queries by eliminating joins.

ACID Properties: Ensuring Transaction Reliability

ACID properties are fundamental guarantees provided by database management systems to ensure reliability during transaction processing.

Atomicity

Definition: A transaction must be treated as an indivisible unit. Either all operations succeed, or none take effect.

Example: Consider a banking application transferring funds between accounts:

SQL
 
BEGIN TRANSACTION;

-- Deduct $500 from savings account
UPDATE Accounts
SET Balance = Balance - 500
WHERE AccountID = 'SAV-1001'
  AND AccountType = 'Savings';

-- Add $500 to checking account
UPDATE Accounts
SET Balance = Balance + 500
WHERE AccountID = 'CHK-2001'
  AND AccountType = 'Checking';

-- Record the transfer in transactions history
INSERT INTO Transactions (
    TransactionID,
    FromAccount,
    ToAccount,
    Amount,
    TransactionDate
)
VALUES (
    NEWID(),
    'SAV-1001',
    'CHK-2001',
    500,
    GETDATE()
);

COMMIT;


If any step fails (e.g., due to a constraint violation or system error), the entire transaction is rolled back, ensuring the balance remains consistent across accounts.

Consistency

Definition: Transactions must transform the database from one valid state to another, maintaining all predefined integrity constraints.

Example: In an inventory management system:

SQL
 
BEGIN
    TRANSACTION;

    -- Customer orders 5 units of product 'P1001'
    INSERT INTO Orders (
        OrderID,
        CustomerID,
        ProductID,
        Quantity
    )
    VALUES (
        'ORD-5001',
        'CUST-101',
        'P1001',
        5
    );

    -- Update inventory (assume current stock is 3 units)
    UPDATE Inventory
    SET QuantityInStock = QuantityInStock - 5
    WHERE ProductID = 'P1001';

    COMMIT;


If there's a constraint that prevents negative inventory, this transaction will fail because it would result in -2 units in stock. The database remains in a consistent state by preventing the invalid transaction.

Isolation

Definition: Concurrent transactions must not interfere with each other, with each transaction acting as if it were the only operation being performed on the database.

Example: Two transactions attempting to update the same customer record:

Transaction 1:

SQL
 
BEGIN TRANSACTION;

UPDATE Customers
SET CreditLimit = CreditLimit + 1000
WHERE CustomerID = 'CUST-101';

-- Other operations...

COMMIT;


Transaction 2:

SQL
 
BEGIN TRANSACTION;

UPDATE Customers
SET Status = 'Premium'
WHERE CustomerID = 'CUST-101';

-- Other operations...

COMMIT;


With proper isolation, the final state of the customer record will include both changes, regardless of execution order, preventing lost updates or inconsistent reads.

Durability

Definition: Once a transaction is committed, its effects must persist even in the event of system failures.

Example: After a completed payment transaction:

SQL
 
BEGIN TRANSACTION;

-- Process payment
UPDATE Orders
SET PaymentStatus = 'Paid'
WHERE OrderID = 'ORD-5001';

-- Record payment in financial system
INSERT INTO Payments (
    PaymentID,
    OrderID,
    Amount,
    PaymentDate
)
VALUES (
    'PAY-9001',
    'ORD-5001',
    1250.00,
    GETDATE()
);

COMMIT;


After commit, the payment record must persist even if there's a power outage or system crash. This is typically achieved through write-ahead logging, transaction logs, and database recovery mechanisms.

Slowly Changing Dimensions (SCDs): Managing Historical Data

SCDs are techniques used in data warehousing to manage dimension attributes that change over time, enabling historical analysis and reporting.

SCD Type 0: Retain Original

Definition: No changes are made to historical data once loaded.

Example: A ProductID dimension where the assigned identifier never changes.

Plain Text
 
ProductID: 1001 
SKU: "WIDGET-A" 
Category: "Hardware"


Even if the product's category changes in the source system, the data warehouse retains the original classification for consistency in historical reporting.

SCD Type 1: Overwrite

Definition: The current value replaces the previous value without maintaining history.

Example: A customer's contact information that needs to be current but doesn't require historical tracking.

Before Update:

Plain Text
 
CustomerID: C1001 
Name: John Smith 
Email: [email protected] 
Address: 123 Main St


After Update:

Plain Text
 
CustomerID: C1001 
Name: John Smith 
Email: [email protected] 
Address: 456 Oak Ave


The previous email and address are completely overwritten, leaving no record of the historical values.

SCD Type 2: Add New Row

Definition: Maintains full history by adding new records with effective date ranges.

Example: Employee position changes within an organization.

EmployeeID VersionID Name Department Position EffectiveStartDate EffectiveEndDate IsCurrent
E101 1 Sarah Johnson Marketing Specialist 2022-01-15 2023-03-31 False
E101 2 Sarah Johnson Marketing Manager 2023-04-01 NULL True


This approach allows querying the employee's position at any point in time, supporting historical analysis.

SCD Type 3: Add New Attribute

Definition: Maintains limited history by adding columns for previous values.

Example: A product dimension tracking category changes:

ProductID ProductName CurrentCategory PreviousCategory CategoryChangeDate
P1001 Widget X Electronics Hardware 2023-02-15
P1002 Gadget Y Accessories NULL NULL


This method preserves only the most recent change but provides a simple way to track when the change occurred.

Choosing the Right Approach

When to Normalize

  • For transactional systems (OLTP)
  • When data integrity is paramount
  • When storage efficiency matters
  • When changes are frequent

When to De-Normalize

  • For analytical systems (OLAP)
  • When query performance is critical
  • When reads significantly outnumber writes
  • For reporting databases

When to Use Different SCD Types

  • Type 0: For dimensions that never change
  • Type 1: For dimensions where only current values matter
  • Type 2: When complete historical tracking is required
  • Type 3: When limited historical tracking is sufficient

Conclusion

Database design requires balancing competing concerns: structural integrity, performance, historical tracking, and transactional reliability. By understanding normalization principles, ACID properties, and SCD techniques, database professionals can make informed decisions that serve their specific application requirements while maintaining data quality and system performance. These concepts form the backbone of successful database architecture, allowing systems to efficiently manage the ever-increasing volume and complexity of modern data landscapes.

Database Database normalization

Opinions expressed by DZone contributors are their own.

Related

  • Common Mistakes to Avoid When Writing SQL Code
  • Parquet vs Lance: How Storage Layout Changes the Read Path
  • LangChain With SQL Databases: Natural Language to SQL Queries
  • Resilience Lost in the Stack: How Abstraction Layers Silently Mask Distributed Systems’ Topology Awareness

Partner Resources

×

Comments

The likes didn't load as expected. Please refresh the page and try again.

  • RSS
  • X
  • Facebook

ABOUT US

  • About DZone
  • Support and feedback
  • Community research

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 215
  • Nashville, TN 37211
  • [email protected]

Let's be friends:

  • RSS
  • X
  • Facebook