Databasdesign

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)

  • Text, detta kan vara en lĂ€ngre text, text

  • Datum, timestamp

Den fÀrdiga tabellen.

describe blog;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| author     | varchar(200) | YES  |     | NULL    |       |
| titel      | varchar(150) | YES  |     | NULL    |       |
| body       | text         | YES  |     | NULL    |       |
| created_at | timestamp    | YES  |     | NULL    |       |
| updated_at | timestamp    | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

Med tabellen skapad sÄ kan sedan data skapas i den.

INSERT INTO `blog`
    (
        `author`,
        `titel`,
        `body`,
        `created_at`,
        `updated_at`
    )
VALUES
    (
        'Jens',
        'Rubrik',
        'Exempel',
        now(),
        now()
    );

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.

# AnvÀndartabell
anvÀndarnamn, namn, email, timestamps

Uppgift

  • Vilka datatyper passar och vilka kolumner behövs?

Tabellen kan sedan skapas. Notera att typen för id kolumen stÀmmer med author_id ur blog tabellen.

describe users;
+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| handle     | varchar(64)     | YES  |     | NULL    |                |
| name       | varchar(200)    | YES  |     | NULL    |                |
| email      | varchar(255)    | YES  |     | NULL    |                |
| created_at | timestamp       | YES  |     | NULL    |                |
| updated_at | timestamp       | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+

Med data.

select * from users;
+----+--------+-----------------+-------------------------+---------------------+---------------------+
| id | handle | name            | email                   | created_at          | updated_at          |
+----+--------+-----------------+-------------------------+---------------------+---------------------+
|  1 | Jens   | Jens Andreasson | jens.andreasson@ntig.se | 2020-11-25 13:37:39 | 2020-11-25 13:37:39 |
|  2 | Moa    | Moa Moasson     | moa@moa.se              | 2020-11-25 13:38:28 | 2020-11-25 13:38:28 |
+----+--------+-----------------+-------------------------+---------------------+---------------------+

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.

select * from blog where author_id = 2;

Last updated