BE 1.6 Heirarkiska databaser
BE 1.7 Relationsdatabaser, SQL och ER-modellering
Table of contents
- Hierarkisk databasmodell
- Relationsdatabasmodell
- SQL
- MySQL syntax
- ER-modellering och samband
- Referenser
Hierarkisk databasmodell
Den hierarkiska databasmodellen är den äldsta typen av data modell. Den utvecklades av IBM 1968, och organiserar data i en trädliknande struktur. Den är uppbyggd enligt följande:
- Noder som är sammankopplade med grenar
- Den översta noden kallas “root node”
- Om det finns flera noder på översta nivån kallas de “root segment”
- Varje node har endast en förälder-node
- En förälder-node kan ha flera barn-noder
Relationsdatabasmodell
Relational Database Management System (RDBMS) utvecklades av E.F. Codd 1970. Det finns inga fysiska länkar som i hierarkiska databaser, istället är de strukturerade enligt följande:
- Data presenteras i form av tabeller
- Den handlar bara om data, inte fysisk struktur
- Den innehåller information om metadata
- Tabeller kan ha inbördes relationer till varandra
- Data sparas som poster/items i rader i tabeller
- Tabeller relaterar till varandra via kolumnvärden
- Behandlar queries väldigt enkelt
SQL
Structured Query Language (SQL) är ett standard query-språk för att kommunicera med och manipulera databaser. Även om SQL är standardiserat enligt ANSI/ISO, så finns det ändå olika versioner av språket. Grunderna har de flesta dock gemensamt. 1
Med SQL kan vi till exempel skapa, hämta, uppdatera och radera data i relationsdatabaser, skapa nya databaser och tabeller samt sätta permissions/rättigheter.
Konventioner
- Stora bokstäver i nyckelord (t.ex SELECT inte select)
- Attribut och variabler med gemener
- Lägg till plural S i tabellnamn (books inte book)
- Skriv tabellnamn med snake_case
- Dela upp långa statements i flera rader (max 80 tecken per rad)
Datatyper 2
Namn | Exempel | Beskrivning |
---|---|---|
INT | id INT | För heltal (-2 147 483 648 till 2 147 483 647) |
VARCHAR | firstname VARCHAR(255) | För strängar upp till 255 tecken långa, men kan vara kortare |
CHAR | isbn CHAR(13) | För strängar som är exakt 13 tecken långa |
SMALLINT | stock SMALLINT | För mindre heltal (-32 768 till 32 767) |
FLOAT | price FLOAT | För decimaltal (flyttal) med noggrannhet ner till 23 decimaler |
ENUM() | type ENUM(‘basic’, ‘premium’) | För att använda ett av de fördefinierade alternativen |
Restriktioner
Undviker att logiska fel uppstår i våra tabeller, och hjälper även till med relationer mellan tabeller.
Namn | Exempel | Beskrivning |
---|---|---|
NOT NULL | id INT NOT NULL | Värden i denna kolumn får inte innehålla NULL |
UNSIGNED | id INT UNSIGNED NOT NULL | Värden för denna kolumn ska inte innehålla negativa tal, detta innebär att INT nu kan lagra dubbelt så stort tal (då vi bortser från den negativa delen) |
Nycklar/keyes
Speciella restriktioner som hjälper till att mer finkornigt styra vad som får läggas till i tabeller, men även hur de relaterar till varandra. Det finns fyra olika nycklar i SQL.
Namn | Exempel | Beskrivning |
---|---|---|
PRIMARY_KEY | id INT NOT NULL PRIMARY KEY | Hanterar att vi endast får unik info från en tabell. Med en primary kay kan en rad inte innehålla samma värde och värdet kan inte vara null. |
FOREIGN_KEY | FOREIGN KEY (book_id) REFERENCES books(id), | Värdet i denna kolumn är satt till foreign/extern nyckel, vilket innebär att värdet är en referens till en annan tabells primary key kolumn. |
UNIQUE | isbn CHAR(13) UNIQUE(isbn) | Värdet för denna kolumn måste vara unikt i tabellen där kolumnen existerar. |
INDEX | ALTER TABLE books ADD INDEX(title); | Skapar ett index för kolumnen i tabellen. Användbart för värden som vi vet kommer att hämtas ofta. |
MySQL syntax
Skapa ny databas med MySQL
Skapa
CREATE DATABASE bookstore;
Välj vilken databas vi ska jobba i
USE bookstore;
Skapa tabellen books
CREATE TABLE books (
title VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
isbn CHAR(13) NOT NULL,
stock SMALLINT UNSIGNED NOT NULL DEFAULT 0,
price FLOAT UNSIGNED
);
Skapa tabellen customer
CREATE TABLE customers(
id INT UNSIGNED NOT NULL,
firstName VARCHAR(255) NOT NULL,
surName VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
type ENUM('basic', 'premium')
);
Lägg till och ändra i befintlig tabell
Lägg till ny kolumn
ALTER TABLE books
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
Ändra i tabell
ALTER TABLE customers
ADD UNIQUE KEY (email);
Lägg till data i tabell
INSERT INTO customers (firstName, surName, email, type)
VALUES ("Vilgot", "Stenwall", "vilgot@datainternet.it", "premium");
(id
är ju auto-increment så den ska inte skrivas in utan mySQL genererar automatiskt)
Läsa/hämta från tabell
Se hur tabellen ser ut
DESC books
genererar:
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(10) unsigned | NO | PRI | NULL | auto_increment |
title | varchar(255) | NO | NULL | ||
author | varchar(255) | NO | NULL | ||
isbn | char(13) | NO | NULL | ||
stock | smallint(5) unsigned | NO | 0 | ||
price | float unsigned | YES | NULL |
Hämta alla items i tabell
SELECT * FROM customers;
genererar:
id | firstName | surName | type | |
---|---|---|---|---|
1 | Vilgot | Stenwall | vilgot@datainternet.it | premium |
ER-modellering och samband
Schema för databaser och tabeller, det vill säga “mallen” för hur de ska se ut, skissas upp med så kallad ER-modellering. ER = Entity Relationship.
Symboler
-
Entitetstyper - själva tabellen, ritas med rektanglar, kan ha attribut
-
Attribut - kolumnerna i tabellen, ritas med cirklar och pilar ut från entitetstypen
-
Sambandstyper - referensattribut, besrkriver relationer mellan tabeller/entitetstyper, ritas som diamanter
Kardinalitetsförhållanden
Sambandstyper kan förtydligas och har tre typer av kardinalitetsförhållanden:
-
N:1/många-till-ett
Räknas som samma typ som 1:N/en-till-många
-
1:1/ett-till-ett
-
N:M/många-till-många
Med N:M skapas en mellantabell för att redogöra för relationen mellan entiteterna
Göra tabell av ett schema
Varje entitetstyp blir tabeller, och attribut blir kolumner.
Schema
Tabell
number | first_name | last_name | phone |
---|---|---|---|
11 | Omar | Faki | 555-123 33 99 |
12 | Hamadh | Hashim | 08-102 030 45 |
5554 | Nivah | Arakash | 555-123 33 44 |
1241 | Fake | Sandakelium | 555-123 99 99 |
N:1 och 1:1
Varje sambandstyp blir ett referensattribut. Kolumnen owner i tabellern car hänvisar till kolumnen number i tabellen person.
Schema
Tabeller
person
number | first_name | last_name | phone |
---|---|---|---|
11 | Omar | Faki | 555-123 33 99 |
12 | Hamadh | Hashim | 08-102 030 45 |
5554 | Nivah | Arakash | 555-123 33 44 |
1241 | Fake | Sandakelium | 555-123 99 99 |
car
number | model | owner |
---|---|---|
ABC123 | Volvo V70 | 11 |
DEF456 | Tesla Model Y | 5554 |
GHI789 | Kia Sportage | 5554 |
N:M
Sambandstypen blir en mellantabell/pivot table.
Schema
Tabeller
person
number | first_name | last_name | phone |
---|---|---|---|
11 | Omar | Faki | 555-123 33 99 |
12 | Hamadh | Hashim | 08-102 030 45 |
5554 | Nivah | Arakash | 555-123 33 44 |
1241 | Fake | Sandakelium | 555-123 99 99 |
house
number | color |
---|---|
1 | green |
2 | red |
3 | blue |
4 | white |
owns
person | house |
---|---|
11 | 1 |
11 | 3 |
5554 | 4 |
1241 | 1 |