Řešení testu na databáze

1. Referenční integrita

Referenční integrita je koncept v relačních databázích, který zajišťuje konzistenci mezi souvisejícími daty v různých tabulkách. Zabývá se:

  • Udržováním platných vztahů mezi primárními a cizími klíči

  • Zamezením tzv. “sirotčím záznamům” (records without parent)

  • Zajištěním, že každá reference na jinou tabulku skutečně existuje

Například pokud máme tabulku objednávek odkazující na tabulku zákazníků, referenční integrita zajistí, že nelze vytvořit objednávku pro neexistujícího zákazníka.

2. Normalizace databáze a 2. normální forma

Proč provádíme normalizaci databáze:

  • Eliminace redundance (opakování) dat

  • Minimalizace anomálií při vkládání, mazání a aktualizaci

  • Zlepšení integrity dat

  • Zjednodušení struktury databáze

2. normální forma (2NF):

Tabulka je ve 2NF, pokud:

  1. Je již v 1NF (všechny atributy jsou atomické, žádné opakující se skupiny)

  2. Žádný neklíčový atribut není závislý na části složeného primárního klíče (musí být závislý na celém primárním klíči)

3. Parcialita (částečná účast) s příkladem

Parcialita (částečná účast) v ER diagramech znamená, že ne všechny entity z jedné entity musí být zapojeny do vztahu s druhou entitou.

Příklad:

[Zaměstnanec] -----(0,N)----<Má>----(0,1)---- [Auto]

V tomto případě:

  • Někteří zaměstnanci mohou mít auto (ale nemusí - částečná účast)

  • Některá auta mohou být přidělena zaměstnancům (ale nemusí - částečná účast)

4. Procedura pro nejstarší a nejmladší auto podle značky

CREATE PROCEDURE NajdiNejstarsiANejmladsiAuto
    @Znacka nvarchar(30)
AS
BEGIN
    SELECT
        @Znacka AS Znacka,
        MIN(dat_vyr) AS NejstarsiAuto,
        MAX(dat_vyr) AS NejmladsiAuto
    FROM
        auta
    WHERE
        Znacka = @Znacka;
END;
GO
 
-- Volání procedury pro značku "Škoda"
EXEC NajdiNejstarsiANejmladsiAuto @Znacka = 'Škoda';

5. Trigger pro zápis nového auta do jiné tabulky

CREATE TRIGGER tr_auta_insert
ON auta
AFTER INSERT
AS
BEGIN
    INSERT INTO historie_aut (znacka, spz, dat_vyr, datum_zaznamu)
    SELECT Znacka, spz, dat_vyr, GETDATE()
    FROM inserted;
END;

Předpokládám, že cílová tabulka **historie_aut** má tyto atributy:

  • znacka (nvarchar(30))

  • spz (nvarchar(20))

  • dat_vyr (date)

  • datum_zaznamu (datetime) - pro zaznamenání, kdy byl záznam vytvořen

6. Připojení tabulky majitel a dotaz na počty aut

-- Předpokládaná struktura tabulky majitel
-- CREATE TABLE majitel (
--     id INT PRIMARY KEY IDENTITY,
--     jmeno NVARCHAR(100) NOT NULL,
--     prijmeni NVARCHAR(100) NOT NULL
-- );
 
-- Přidání cizího klíče do tabulky auta (pokud ještě neexistuje)
ALTER TABLE auta
ADD majitel_id INT,
CONSTRAINT FK_auta_majitel FOREIGN KEY (majitel_id) REFERENCES majitel(id);
 
-- Dotaz na počty aut jednotlivých majitelů
SELECT
    m.jmeno + ' ' + m.prijmeni AS majitel,
    COUNT(a.spz) AS pocet_aut
FROM
    majitel m
LEFT JOIN
    auta a ON m.id = a.majitel_id
GROUP BY
    m.jmeno, m.prijmeni
ORDER BY
    pocet_aut DESC;

7. View pro výběr aut konkrétního majitele (Dvořák)

CREATE VIEW AutaMajiteleDvorak AS
SELECT
    a.Znacka,
    a.spz,
    a.dat_vyr,
    m.jmeno + ' ' + m.prijmeni AS majitel
FROM
    auta a
JOIN
    majitel m ON a.majitel_id = m.id
WHERE
    m.prijmeni = 'Dvořák';

Toto view pak lze použít jednoduchým SELECTem:

SELECT * FROM AutaMajiteleDvorak;