För databasdesign brukar det pratas om normalisering, eller normalform. Det Àr ett antal regler som behöver efterföljas. Det Àr bra att kÀnna till men hÀr kommer det vara nÄgot förenklat.
NÀr du ska designa tabeller sÄ börja med att fundera pÄ hur den data som ska sparas kommer att se ut.
# Blogg
författare, titel, text, datum
UtifrÄn detta sÄ vÀljs sedan datatyper för de olika kolumnerna.
Författare, text med ett namn, hur mÄnga tecken kan behövas, varchar(200)
Titel, text med ett begrÀnsat antal tecken, varchar(150)
Kör frÄgan ovan ett antal gÄnger. VÀlj sedan all data med en select frÄga.
select * from blog;
+--------+--------+---------+---------------------+---------------------+
| author | titel | body | created_at | updated_at |
+--------+--------+---------+---------------------+---------------------+
| Jens | Rubrik | Exempel | 2020-11-25 13:17:39 | 2020-11-25 13:17:39 |
| Jens | Rubrik | Exempel | 2020-11-25 13:17:41 | 2020-11-25 13:17:41 |
| Jens | Rubrik | Exempel | 2020-11-25 13:17:41 | 2020-11-25 13:17:41 |
| Jens | Rubrik | Exempel | 2020-11-25 13:17:42 | 2020-11-25 13:17:42 |
+------+--------+--------+---------+---------------------+---------------------+
4 rows in set (0.00 sec)
Detta fungerar okej Àn sÄ lÀnge och följer viss normalform(vi har bara ett vÀrde i varje fÀlt, jÀmför med att vi hade sparat email i author tillsammans med namn) men det visar ocksÄ nÄgra problem.
Data i author tabellen upprepas ofta, det Àr nÄgot som bryter mot normalformen.
Det finns inget bra sÀtt att vÀlja data. Om du vill hÀmta en rad ur denna databas, hur bestÀmmer du vilken?
För att normalisera tabellen behöver först varje rad ett ID sÄ att de gÄr att identifiera. VÀrdet i denna ID kolumn sköter databasen med auto_increment. Det andra som ska göras Àr anvÀnda en relation för författarkolumnen.
describe blog;
+------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| author_id | bigint unsigned | YES | | NULL | |
| title | varchar(200) | YES | | NULL | |
| body | text | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+------------+-----------------+------+-----+---------+----------------+
Den data som tabellen innehÄller ser nu ut som följer.
select * from blog;
+----+-----------+---------+-----------+---------------------+---------------------+
| id | author_id | title | body | created_at | updated_at |
+----+-----------+---------+-----------+---------------------+---------------------+
| 1 | 1 | Test | Test text | 2020-11-25 13:31:23 | 2020-11-25 13:31:23 |
| 2 | 1 | Another | Text here | 2020-11-25 13:31:47 | 2020-11-25 13:31:47 |
+----+-----------+---------+-----------+---------------------+---------------------+
Det som saknas nu Àr en tabell för författaren. Likt föregÄende exempel sÄ börjar det med en planering av vilken data som tabellen bör innehÄlla.
Med data delat pÄ flera tabeller sÄ kommer relationsdatabasens styrkor fram. Genom att koppla author_id till ett id ur users tabellen sÄ gÄr det nu att vÀlja data frÄn bÄda tabellerna med join.
select blog.title, blog.body, blog.created_at, users.name as author
from blog
left join users on blog.author_id = users.id;
+---------+-----------+---------------------+-----------------+
| title | body | created_at | author |
+---------+-----------+---------------------+-----------------+
| Test | Test text | 2020-11-25 13:31:23 | Jens Andreasson |
| Another | Text here | 2020-11-25 13:31:47 | Jens Andreasson |
+---------+-----------+---------------------+-----------------+
Eftersom tabellerna nu har ID fÀlt sÄ gÄr det Àven att vÀlja specifika fÀlt genom att identifiera dem med ID vÀrdet.
select * from blog where id = 2;
+----+-----------+---------+-----------+---------------------+---------------------+
| id | author_id | title | body | created_at | updated_at |
+----+-----------+---------+-----------+---------------------+---------------------+
| 2 | 1 | Another | Text here | 2020-11-25 13:31:47 | 2020-11-25 13:31:47 |
+----+-----------+---------+-----------+---------------------+---------------------+
Samt att det enkelt gÄr att vÀlja poster skapade av en specifik författare.