Databázové systémy Relační model
Relační model E.F.Codd: „A relational data model for large shared data banks“ - 1970 Vlastnosti: Oddělení logické struktury dat od implementace, Transparentnost přístupových metod při manipulacích s daty, Poskytnutí matematické podpory pro manipulaci s daty, Poskytnutí matematické podpory k omezení redundance při návrhu logické struktury databáze.
Relační model jde o model uchovávání entit / vztahů v tabulkách 1 tabulka na entitní/vztahový typ sloupec tabulky reprezentuje atribut (A) entity řádek tabulky reprezentuje datovou entitu/vztah (E) schéma tabulky – popis struktury tabulky (všeho kromě dat) N(Ai:Ti) – kde N je název tabulky, Ai jsou atributy a Ti jejich typy buňka tabulky na pozici (x,y) uchovává hodnotu atributu A(x) v kontextu entity/vztahu E(y) schéma relační databáze – množina schémat tabulek (+integritní omezení...)
Tabulkové vyjádření relace a její vlastnosti Atribut2 Atribut3 Atribut n Atribut1 záznam položka Struktura tabulky Název „relační model“ a „relační databáze“ je odvozen od faktu, že relace je základním abstraktním pojmem modelu a jedinou strukturou databáze na logické úrovni.
Integritní pravidla v relačním modelu Integritní pravidla jsou omezení plynoucí z reality reprezentované daty v dané databázi Typy integritních omezení: obecná – musí platit v každé databázi daného typu specifická – pro konkrétní aplikaci Obecná integritní omezení neexistují 2 stejné řádky (unikátní identifikace entit), každý řádek je identifikovatelný (odlišitelný od ostatních) jedním nebo více pevně určenými atributy v rámci tabulky - klíč tabulky, skupina atributů, která existuje i v jiné (tzv. referenční) tabulce a tam tvoří klíč - cizí klíč, rozsah hodnot atributu je dán typem (typované atributy), tabulka neobsahuje prázdné buňky - všechny hodnoty jsou definované.
Indexy Jsou takové prvky dat, podle nichž lze jednoznačně určit i ostatní atributy téhož záznamu. Indexy podstatně urychlují vyhledávání v databázi. Unikátní - jednoznačný index - hodnoty v indexu se nesmí opakovat Primární - stejný jako unikátní index, může být pouze jeden v tabulce - tento klíč jednoznačně identifikuje záznam Neunikátní - hodnoty se smějí libovolně opakovat.
Primární klíč - atribut, který jednoznačně identifikuje n-tici v relaci Atribut K relace R se nazývá kandidátním klíčem, když má tyto dvě časově nezávislé vlastnosti: jednoznačnost minimalita (neredukovatelnost). Primárním klíčem PK je jeden (vybraný) z kandidátních klíčů, zbývající kandidátní klíče se nazývají alternativní. -způsob výběru primárního klíče není v relačním modelu specifikován Každá n-tice bázové relace musí být v každém okamžiku jednoznačně identifikovatelná hodnotou primárního klíče.
Cizí klíč Atribut FK bázové relace R2 se nazývá cizí klíč, právě když splňuje tyto časově nezávislé vlastnosti: 1. Každá hodnota FK je buď plně zadaná nebo plně nezadaná. 2. Existuje bázová relace R1 s primárním klíčem PK takovým, že každá zadaná hodnota FK je identická s hodnotou PK nějaké n-tice relace R1. Pravidlo referenční integrity DB nesmí obsahovat žádnou nesouhlasnou hodnotu cizího klíče!
Příklad 1 prim. klíč cizí klíč (klíč v tabulce Autor) prim. klíč Kniha (Název text, Autor text, Cena číslo, Skladem číslo) Název je primární klíč, Autor je cizí klíč do tabulky Autor(Jméno) Název Autor Cena Skladem Bídníci Hugo, Victor 150,- 10 Temno Jirásek, Alois 120,- 16 Básně Wolker, Jiří 125,- 15 Kóma Cook, Robert 190,- 32 Infekce 170,- 20 R.U.R Čapek, Karel 90,- 36 prim. klíč cizí klíč (klíč v tabulce Autor) Autor (Jméno text, Adresa text, Žije ano/ne) Jméno je primární klíč Jméno Adresa Žije Čapek, Karel Praha NE Jirásek, Alois Plzeň Wolker, Jiří Cook, Robert USA ANO May, Karel Německo Hugo, Victor Francie prim. klíč
Příklad 2 složený klíč složený cizí klíč (klíč v tabulce Auto) Řidič (Jméno text, Příjmení text, MK text, SPZ text), Jméno a Příjmení je klíč, MK a SPZ je cizí klíč do tabulky Auto(Mezinárodní kód, SPZ) Jméno Příjmení MK SPZ Jan Nový CZ 5B62345 Petr Novák 1Z22543 Václav Nováček 3A85461 Ivan Novotný SK BA456Z Adam Novický RU BU0124 složený klíč složený cizí klíč (klíč v tabulce Auto) Auto (Mezinárodní kód: text, SPZ:text, Značka: text) Mezinárodní kód a SPZ je klíč Mezinárodní kód SPZ Značka CZ 1Z22543 Škoda 3A85461 Peugeot 5B62345 Volvo D A156Z VW RU BU0124 Dacia SK BA456Z Kia složený klíč
Převod ER diagramu Převod obecně Výstupem z ER diagramů je seznam tabulek, do kterých budou uložená data, obsahující: názvy sloupců, zachování integritních omezení (pokud možno 1:1). Převod obecně silný entitní typ – tabulka klíčem je identifikátor entity slabý entitní typ – tabulka klíčem je smíšený (externí) identifikátor vztahový typ – tabulka počet tabulek a jejich sdílení vztahu a entit se řídí kardinalitami vztahu, do něhož tyto entity vstupují integritní omezení ve formě klíčů tabulek n-ární vztahy se převádějí v principu stejně jako binární
Kardinality (1,1) : (1,1) jediná tabulka – klíčem může být identifikátor libovolné z entit (nebo oba) Relační schéma: OsobaMobil(RČ, jméno, příjmení, ..., sériové číslo, model, výrobce, ...)
Kardinality (1,1) : (0,1) dvě tabulky T1 a T2 T1 existuje nezávisle na T2 T2 obsahuje identifikátor/klíč z T1, který je zde cizím klíčem do T1 reprezentace vztahu je „ukrytá“ v tabulce T2 Relační schéma: Osoba(RČ, jméno, příjmení, ..., sériové číslo) Mobil(sériové číslo, model, výrobce, ...)
Kardinality (0,1) : (0,1) tři tabulky – dvě entitní a jedna vztahová vztahová tabulka má dva klíče odpovídající identifikátorům obou entitních typů klíče jsou zároveň cizí klíče do entitních tabulek Relační schéma: Osoba(RČ, jméno, příjmení, ...) Mobil(sériové číslo, model, výrobce, ...) Vlastní(RČ, sériové číslo)
Kardinality (0 nebo 1,n) : (1,1) podobně jako u (1,1) : (0,1) – dvě tabulky T1 a T2 T1 existuje nezávisle na T2 T2 obsahuje identifikátor T1, který je zde cizím klíčem do T1 reprezentace vztahu je „ukrytá“ v tabulce T2 Relační schéma: Osoba(RČ, jméno,příjmení, ...) Mobil(sériové číslo, model, výrobce, ..., RČ)
Kardinality (0 nebo 1,n) : (0,1) podobně jako (0,1) : (0,1) – tři tabulky – dvě entitní a jedna vztahová vztahová tabulka má jeden klíč odpovídající identifikátoru jednoho z entitních typů, identifikátor druhého entitního typu je pouze cizím klíčem klíč je zároveň cizí klíč do jedné z entitních tabulek Relační schéma: Osoba(RČ, jméno, příjmení, ...) Mobil(sériové číslo, model, výrobce, ...) Vlastní(RČ, sériové číslo)
Kardinality (0 nebo 1,n) : (0 nebo 1,n) nejobecnější situace – tři tabulky dvě entitní a jedna vztahová klíč ve vztahové tabulce je složený z identifikátorů obou entitních typů všechny části klíče vztahové tabulky jsou cizími klíči do tabulek vázaných Relační schéma: Osoba(RČ, jméno, příjmení, ...) Mobil(sériové číslo, model, výrobce, ...) Vlastní(RČ, sériové číslo)
Transformace ER diagramu na tabulky relační databáze Hlavní problémy špatného návrhu: opakující se informace (redundance) cyklické struktury – nesplňují předpoklad jednoznačnosti nemožnost reprezentovat určitou informaci - složitá kontrola integritních omezení
Pravidla transformace Odstranění složených a vícehodnotových atributů
Pravidla transformace Vícehodnotový atribut → náhrada opakováním nebo slabá entitní množina
Příklad – Rezervace
Příklad – Rezervace -- Skript pro vytvoreni schematu databaze -- -- Vytvoreni tabulek – CREATE TABLE Zakaznik ( Id Integer NOT NULL, Adresa Varchar(100) NOT NULL, Telefon Varchar(12) NOT NULL, CONSTRAINT pk_Zakaznik PRIMARY KEY (Id)); CREATE TABLE Predstaveni ( Datum Date NOT NULL, Nazev Varchar(50) NOT NULL, CONSTRAINT pk_Predstaveni PRIMARY KEY (Id)); CREATE TABLE Sedadla ( Stav Integer NOT NULL, Sedadlo Integer NOT NULL, Rada Integer NOT NULL, Sekce Integer NOT NULL, patri_Id Integer NOT NULL, CONSTRAINT pk_Sedadla PRIMARY KEY (Id, patri_Id), CONSTRAINT fk_Sedadla_Predstaveni FOREIGN KEY (patri_Id) REFERENCES Predstaveni(Id));
Příklad – Rezervace CREATE TABLE Rezervuje ( Sedadla_Id Integer NOT NULL, Sedadla_patri_Id Integer NOT NULL, Zakaznik_Id Integer NOT NULL, CONSTRAINT pk_rezervuje PRIMARY KEY (Sedadla_Id, Sedadla_patri_Id), CONSTRAINT fk_rezervuje_Sedadla FOREIGN KEY (Sedadla_Id, Sedadla_patri_Id) REFERENCES Sedadla(Id,patri_Id), CONSTRAINT fk_rezervuje_Zakaznik FOREIGN KEY (Zakaznik_Id) REFERENCES Zakaznik(Id)); -- Konec skriptu --