Relationsdatabaser

Relationsdatabaser är grunden för modern datahantering och utgör ryggraden i de flesta affärssystem idag. Genom att förstå grundprinciperna för relationsdatabaser kan utvecklare skapa effektiva, skalbara och säkra datalagringslösningar som säkerställer dataintegritet och prestanda.

Innehållsförteckning

Introduktion

En relationsdatabas organiserar data i tabeller som består av rader och kolumner, där relationer kan etableras mellan olika tabeller. Denna struktur möjliggör effektiv lagring, sökning och hantering av stora mängder relaterad data. Konceptet utvecklades av Edgar F. Codd på 1970-talet och har sedan dess blivit den dominerande modellen för databashantering.

Vad är en relationsdatabas

Relationsdatabaser kan bäst förstås genom analogin med ett välorganiserat bibliotek:

Tabeller fungerar som olika hyllsektioner för olika ämnen (böcker, författare, låntagare).

Rader representerar individuella poster, som enskilda böcker eller personer.

Kolumner definierar specifika attribut, som titel, författare, publiceringsår eller ISBN.

Relationer skapar kopplingar mellan tabeller, som vilka böcker en viss författare har skrivit.

Grundläggande struktur

-- Exempel på en enkel tabell för böcker
CREATE TABLE Books (
    BookId INTEGER PRIMARY KEY,
    Title TEXT NOT NULL,
    AuthorId INTEGER,
    PublicationYear INTEGER,
    ISBN TEXT UNIQUE,
    FOREIGN KEY (AuthorId) REFERENCES Authors(AuthorId)
);

Grundläggande koncept

Tabeller (Relations)

En tabell representerar en entitet i verkligheten, som kunder, produkter eller beställningar. Varje tabell har ett unikt namn och består av rader och kolumner.

Rader (Tuples/Records)

Varje rad representerar en specifik instans av entiteten. I en kundtabell skulle varje rad representera en unik kund med alla deras attribut.

Kolumner (Attributes)

Kolumner definierar vilken typ av information som lagras för varje entitet. Exempel: namn, ålder, e-postadress.

Primary Key (Primärnyckel)

En eller flera kolumner som unikt identifierar varje rad i tabellen. Ingen rad kan ha samma primary key-värde.

CREATE TABLE Customers (
    CustomerId INTEGER PRIMARY KEY,  -- Unik identifierare
    Name TEXT NOT NULL,
    Email TEXT UNIQUE,
    PhoneNumber TEXT
);

Foreign Key (Främmande nyckel)

En kolumn som refererar till primary key i en annan tabell, vilket skapar relationer mellan tabeller.

CREATE TABLE Orders (
    OrderId INTEGER PRIMARY KEY,
    CustomerId INTEGER,              -- Refererar till Customers.CustomerId
    OrderDate DATE,
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

ACID-egenskaper

ACID är de fyra grundläggande egenskaper som garanterar tillförlitlighet i databastransaktioner:

Atomicity (Atomicitet)

En transaktion är antingen helt genomförd eller inte alls. Om något går fel rullas alla ändringar tillbaka.

-- Exempel: Överföring mellan bankkonton
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 1000 WHERE AccountId = 1;
UPDATE Accounts SET Balance = Balance + 1000 WHERE AccountId = 2;
COMMIT; -- Båda operationer lyckas, annars ROLLBACK

Consistency (Konsistens)

Databasen är alltid i ett giltigt tillstånd före och efter en transaktion. Alla constraints och regler följs.

Isolation (Isolering)

Samtidiga transaktioner påverkar inte varandra. Varje transaktion körs som om den vore ensam.

Durability (Beständighet)

När en transaktion är genomförd förblir ändringarna permanenta, även vid systemkrascher.

Relationer mellan tabeller

One-to-Many (En-till-många)

Den vanligaste relationstypen. En post i en tabell kan relatera till flera poster i en annan tabell.

-- En kund kan ha flera beställningar
CREATE TABLE Customers (
    CustomerId INTEGER PRIMARY KEY,
    Name TEXT NOT NULL
);

CREATE TABLE Orders (
    OrderId INTEGER PRIMARY KEY,
    CustomerId INTEGER NOT NULL,
    OrderDate TEXT NOT NULL,
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

One-to-One (En-till-en)

En post i en tabell relaterar till exakt en post i en annan tabell.

-- En person har exakt en profil
CREATE TABLE Persons (
    PersonId INTEGER PRIMARY KEY,
    Name TEXT NOT NULL
);

CREATE TABLE Profiles (
    ProfileId INTEGER PRIMARY KEY,
    PersonId INTEGER UNIQUE,         -- UNIQUE säkerställer 1:1 relation
    Bio TEXT,
    FOREIGN KEY (PersonId) REFERENCES Persons(PersonId)
);

Many-to-Many (Många-till-många)

Flera poster i en tabell kan relatera till flera poster i en annan tabell. Kräver en mellanliggande tabell.

-- Studenter kan ta flera kurser, kurser kan ha flera studenter
CREATE TABLE Students (
    StudentId INTEGER PRIMARY KEY, Name TEXT
);
CREATE TABLE Courses (
    CourseId INTEGER PRIMARY KEY, Title TEXT
);
CREATE TABLE StudentCourses (
    StudentId INTEGER,
    CourseId INTEGER,
    PRIMARY KEY (StudentId, CourseId),
    FOREIGN KEY (StudentId) REFERENCES Students(StudentId),
    FOREIGN KEY (CourseId) REFERENCES Courses(CourseId)
);

Fördelar med relationsdatabaser

Dataintegritet

Genom constraints och foreign keys säkerställs att data alltid är korrekt och konsistent.

Flexibilitet

Data kan kombineras från olika tabeller på många sätt utan att duplicera information.

Standardisering

SQL är en internationell standard som fungerar över olika databasystem.

Skalbarhet

Relationsdatabaser kan hantera allt från små applikationer till enterprise-system.

Säkerhet

Inbyggda säkerhetsfunktioner för autentisering, auktorisering och kryptering.

Normalisering

Normalisering är processen att strukturera data för att minimera redundans och förbättra dataintegritet.

Första normalformen (1NF)

  • Varje kolumn innehåller atomära värden (inga listor eller komma-separerade värden)
  • Varje rad är unik
  • Kolumnordning spelar ingen roll

Andra normalformen (2NF)

  • Uppfyller 1NF
  • Alla non-key-kolumner är helt beroende av primary key

Tredje normalformen (3NF)

  • Uppfyller 2NF
  • Inga transitiva beroenden (non-key-kolumner beror inte på andra non-key-kolumner)
-- Exempel på normalisering
-- Onormaliserad tabell
CREATE TABLE OrderInfo (
    OrderId INTEGER,
    ProductName TEXT,
    ProductPrice DECIMAL,
    CustomerName TEXT,
    CustomerEmail TEXT
);

-- Efter normalisering (3NF)
CREATE TABLE Customers (
    CustomerId INTEGER PRIMARY KEY,
    Name TEXT,
    Email TEXT
);

CREATE TABLE Products (
    ProductId INTEGER PRIMARY KEY,
    Name TEXT,
    Price DECIMAL
);

CREATE TABLE Orders (
    OrderId INTEGER PRIMARY KEY,
    CustomerId INTEGER,
    ProductId INTEGER,
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId),
    FOREIGN KEY (ProductId) REFERENCES Products(ProductId)
);

Praktiska exempel

E-handelsystem

-- Komplett exempel för en enkel webshop
CREATE TABLE Categories (
    CategoryId INTEGER PRIMARY KEY,
    CategoryName TEXT NOT NULL,
    Description TEXT
);

CREATE TABLE Products (
    ProductId INTEGER PRIMARY KEY,
    ProductName TEXT NOT NULL,
    Description TEXT,
    Price DECIMAL(10,2) NOT NULL,
    Stock INTEGER DEFAULT 0,
    CategoryId INTEGER,
    FOREIGN KEY (CategoryId) REFERENCES Categories(CategoryId)
);

CREATE TABLE Customers (
    CustomerId INTEGER PRIMARY KEY,
    FirstName TEXT NOT NULL,
    LastName TEXT NOT NULL,
    Email TEXT UNIQUE NOT NULL,
    PhoneNumber TEXT,
    CreatedDate DATE DEFAULT CURRENT_DATE
);

CREATE TABLE Orders (
    OrderId INTEGER PRIMARY KEY,
    CustomerId INTEGER NOT NULL,
    OrderDate DATE DEFAULT CURRENT_DATE,
    TotalAmount DECIMAL(10,2),
    Status TEXT DEFAULT 'pending',
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

CREATE TABLE OrderItems (
    OrderItemId INTEGER PRIMARY KEY,
    OrderId INTEGER NOT NULL,
    ProductId INTEGER NOT NULL,
    Quantity INTEGER NOT NULL,
    UnitPrice DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (OrderId) REFERENCES Orders(OrderId),
    FOREIGN KEY (ProductId) REFERENCES Products(ProductId)
);

Frågor för att hämta data

-- Hämta alla produkter i en kategori
SELECT p.ProductName, p.Price, c.CategoryName
FROM Products p
JOIN Categories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryName = 'Electronics';

-- Hämta kundens orderhistorik
SELECT o.OrderId, o.OrderDate, o.TotalAmount, o.Status
FROM Orders o
JOIN Customers c ON o.CustomerId = c.CustomerId
WHERE c.Email = 'customer@example.com'
ORDER BY o.OrderDate DESC;

-- Hämta detaljerad orderinformation
SELECT o.OrderId, c.FirstName, c.LastName, p.ProductName,
       oi.Quantity, oi.UnitPrice, (oi.Quantity * oi.UnitPrice) AS LineTotal
FROM Orders o
JOIN Customers c ON o.CustomerId = c.CustomerId
JOIN OrderItems oi ON o.OrderId = oi.OrderId
JOIN Products p ON oi.ProductId = p.ProductId
WHERE o.OrderId = 1;

Slutsats

Relationsdatabaser erbjuder en robust och beprövad metod för datahantering som kombinerar flexibilitet med dataintegritet. Genom att förstå grundläggande koncept som tabeller, relationer, ACID-egenskaper och normalisering kan utvecklare skapa effektiva datastrukturer som stödjer komplexa affärsregler och växer med organisationens behov. Relationsdatabaser förblir den föredragna lösningen för många applikationer tack vare deras mognad, standardisering och omfattande verktygsekosystem.

TL;DR

Relationsdatabaser organiserar data i tabeller med rader och kolumner. Viktiga koncept inkluderar primary keys för unik identifiering, foreign keys för relationer mellan tabeller, och ACID-egenskaper som garanterar datatillförlitlighet. Tre typer av relationer existerar: one-to-many (vanligast), one-to-one, och many-to-many (kräver mellanliggande tabell). Normalisering minimerar dataredundans genom 1NF, 2NF och 3NF. Fördelar inkluderar dataintegritet, flexibilitet, standardisering och skalbarhet. Relationsdatabaser är idealiska för strukturerad data med komplexa relationer.


Upp

Upp


Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rättigheter förbehållna.
Du får använda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du får inte använda detta verk för kommersiella ändamål utan tillstånd från upphovsmannen.