Ř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:
-
Je již v 1NF (všechny atributy jsou atomické, žádné opakující se skupiny)
-
Žá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;