← Tilbage til koncepter

Database Normalization

Arkitektur

Proces til at organisere relationelle databaser for at reducere redundans og forbedre data integritet.

Beskrivelse

Database normalization er en systematisk tilgang til at designe relationelle databaser ved at opdele tabeller i mindre, mere fokuserede tabeller og definere relationer mellem dem. Formålet er at eliminere data redundans (samme information gentaget flere steder) og sikre data integritet. Normalisering følger en række normale former (Normal Forms): 1NF kræver atomiske værdier og ingen gentagne grupper, 2NF fjerner partial dependencies, 3NF eliminerer transitive dependencies, BCNF er en strengere version af 3NF, og 4NF/5NF håndterer multi-valued dependencies. Normalisering har trade-offs: højere normal former giver bedre data integritet men kan kræve flere joins, hvilket kan påvirke performance. I praksis normaliseres de fleste produktionsdatabaser til 3NF, og denormalisering anvendes strategisk hvor performance kræver det. God normalisering gør databasen lettere at vedligeholde og udvide.

Problem

Unormaliserede databaser lider af anomalier: insertion anomalies (kan ikke indsætte data uden andre data), deletion anomalies (sletning af én ting sletter ureleret information), og update anomalies (samme data skal opdateres flere steder).

Løsning

Normalisering opdeler tabeller systematisk så hver tabel repræsenterer én entitet, og relationer håndteres via foreign keys. Dette sikrer at hver fact kun gemmes ét sted.

Eksempel

-- UNNORMALIZED (0NF) - dårligt design
CREATE TABLE orders (
  order_id INT,
  customer_name VARCHAR(100),
  customer_email VARCHAR(100),
  customer_address VARCHAR(200),
  product_names VARCHAR(500), -- 'Laptop, Mouse, Keyboard'
  product_prices VARCHAR(100)  -- '8999, 299, 599'
);
-- Problem: Gentaget customer info, multi-valued attributes

-- 1NF - Atomic values
CREATE TABLE orders_1nf (
  order_id INT,
  customer_name VARCHAR(100),
  customer_email VARCHAR(100),
  customer_address VARCHAR(200),
  product_name VARCHAR(100),
  product_price DECIMAL(10,2)
);
-- Forbedring: Ingen multi-valued fields, men stadig redundans

-- 2NF - Remove partial dependencies
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE
);

CREATE TABLE order_items (
  order_id INT,
  product_id INT,
  quantity INT,
  price DECIMAL(10,2),
  PRIMARY KEY (order_id, product_id)
);
-- Forbedring: Order items separat

-- 3NF - Remove transitive dependencies
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100),
  address VARCHAR(200)
);

CREATE TABLE products (
  product_id INT PRIMARY KEY,
  name VARCHAR(100),
  price DECIMAL(10,2)
);

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
  order_id INT,
  product_id INT,
  quantity INT,
  PRIMARY KEY (order_id, product_id),
  FOREIGN KEY (order_id) REFERENCES orders(order_id),
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- Perfekt: Hver fact ét sted, ingen redundans

Fordele

  • Eliminerer data redundans
  • Forbedrer data consistency og integrity
  • Lettere at opdatere og vedligeholde
  • Mindre storage requirements
  • Reducerer anomalies ved updates

Udfordringer

  • Flere joins kan reducere query performance
  • Mere komplekse queries
  • Kan være overkill for simple applikationer
  • Kræver god forståelse af domain
  • Balancering mellem normalisering og performance

Anvendelsesområder

  • OLTP systemer med mange writes
  • Enterprise applikationer med kompleks business logic
  • Multi-user systemer hvor data integritet er kritisk
  • E-commerce platforme
  • Banking og financial systemer

Eksempler fra den virkelige verden

  • E-commerce order systems (customers, orders, products separat)
  • Hospital patient records (patients, appointments, treatments)
  • University course registration (students, courses, enrollments)
  • Library management (books, members, loans)
  • HR systemer (employees, departments, salaries)