dbwebb-se / databas

Course repo for database course (dbw).
Other
4 stars 2 forks source link

ER hur ska man modellera en loggtabell? #29

Open mosbth opened 3 years ago

mosbth commented 3 years ago

Håller på att jobba med ER modelleringen just nu och jag är lite kluven på hur logg ska fungera, om den relaterar till de olika entiteter som skapar händelser så kan jag tycka att det blir väldigt klumpigt så jag har tänkt om den skulle istället vara fristående. Men om jag gör det på det viset så vet jag inte riktigt hur loggen ska kunna veta till exempel vilken order som har skapats osv

I uppgiften står det så här:

Det skall finnas en logg där man kan se viktiga händelser i systemet, vad hände, när hände det. Det kan till exempel vara när order/faktura skapades eller raderades.

Här är en variant där man försöker modellera loggtabellen med relationer till de entiteter som den skall logga.

2021-02-24_13:43:30_553x541

När man modellerar en loggtabell med relationer så får den snabbt relationer till nästan alla tabeller, det kan se lite "kluddigt" ut på din modell.

Man kan också modellera en mer avskild loggtabell som inte nödvändigtvis består at FK till de andra tabellerna. I ett sådant fall så tänker man mer att man loggar händelser och sparar tidsstämplar och strängar om vad som har hänt. Man har alltså inte nödvändigtvis kopplingar i loggtabellen till andra tabeller.

Det är två olika vägar att se på det.

I kmom05 i föreläsningen och artikeln om triggers så visas på en loggtabell som är mer fristående. Rent SQL-mässigt är dess struktur så här:

--
-- Log table
--
DROP TABLE IF EXISTS account_log;
CREATE TABLE account_log
(
    `id` INTEGER PRIMARY KEY AUTO_INCREMENT,
    `when` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `what` VARCHAR(20),
    `account` CHAR(4),
    `balance` DECIMAL(4, 2),
    `amount` DECIMAL(4, 2)
);

När man använder loggtabellen på det viset kan dess innehåll se ut så här.

+----+---------------------+-----------------+---------+---------+--------+
| id | when                | what            | account | balance | amount |
+----+---------------------+-----------------+---------+---------+--------+
|  1 | 2019-02-12 10:42:06 | move_money from | 1111    |    NULL |  -1.50 |
|  2 | 2019-02-12 10:42:06 | move_money to   | 2222    |    NULL |   1.50 |
|  3 | 2019-02-12 11:13:12 | trigger         | 2222    |   13.00 |   1.50 |
|  4 | 2019-02-12 11:13:12 | trigger         | 1111    |    4.00 |  -1.50 |
|  5 | 2019-02-12 11:13:12 | move_money from | 1111    |    NULL |  -1.50 |
|  6 | 2019-02-12 11:13:12 | move_money to   | 2222    |    NULL |   1.50 |
+----+---------------------+-----------------+---------+---------+--------+

Personligen föredrar jag denna varianten, utan att ha direkta FK-kopplingar till andra tabeller. Men man måste vara medveten om att applikationens kravställning kan påverka vilka lösningar som är giltiga.

I vårt fall fungerar båda varainterna. Kanske bör man välja den som är enklast.