📄
Webbserverprogrammering
  • Start
  • Utvecklarmiljö
    • Windows Subsystem for Linux
  • Teknisk orientering
    • Viktiga begrepp
  • Webbserver
    • Introduktion
    • Hur fungerar det?
    • Design - inte sĂ„ webbserver
    • Aktiv sida
    • Praxis
  • Databas
    • SQL
    • Ett exempel
    • SQL och Node
    • Databasdesign
    • CRUD Meeps
    • CRUD Filmdatabas
  • SĂ€kerhet
    • Introduktion
    • Inloggning
  • MVC
    • Model
    • Controller
    • View
  • Tester
    • Automatiserade tester
    • Testdriven utveckling
  • Containers
    • Docker
  • Laravel
    • Laravel, Nginx, Mysql
Powered by GitBook
On this page

Was this helpful?

Last updated 4 years ago

Was this helpful?

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.

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.

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

Kör frÄgan ovan ett antal gÄnger. VÀlj sedan all data med en select frÄga.

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.

Den data som tabellen innehÄller ser nu ut som följer.

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.

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.

Med data.

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.

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.

Samt att det enkelt gÄr att vÀlja poster skapade av en specifik författare.

# Blogg
författare, titel, text, datum
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    |       |
+------------+--------------+------+-----+---------+-------+
INSERT INTO `blog`
    (
        `author`,
        `titel`,
        `body`,
        `created_at`,
        `updated_at`
    )
VALUES
    (
        'Jens',
        'Rubrik',
        'Exempel',
        now(),
        now()
    );
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)
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    |                |
+------------+-----------------+------+-----+---------+----------------+
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 |
+----+-----------+---------+-----------+---------------------+---------------------+
# AnvÀndartabell
anvÀndarnamn, namn, email, timestamps
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    |                |
+------------+-----------------+------+-----+---------+----------------+
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 |
+----+--------+-----------------+-------------------------+---------------------+---------------------+
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 |
+---------+-----------+---------------------+-----------------+
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 |
+----+-----------+---------+-----------+---------------------+---------------------+
select * from blog where author_id = 2;
  1. Databas

Databasdesign

PreviousSQL och NodeNextCRUD Meeps