A5M33IZS Informační a znalostní systémy Relační databázová technologie
Přechod z konceptuálního na logický model Entitní typ tabulka Atribut entitního typu sloupec tabulky Vztah: vazba 1:1 a 1:N: Vztah cizí klíč na straně N atribut vztahu sloupec tabulky na straně N vazba N:M: Vztah vazební tabulka Atribut vztahu sloupec vazební tabulky Doplňují se: integritní omezení Omezení hodnot atributů, klíče, unikátnost dat, atp.
http://www.sybase.com/products/modelingmetadata/powerdesigner
Relační databáze primární klíč Klíč: množina (může být i jednoprvková) atributů (sloupců), jež jednoznačně identifikuje danou entitu (záznam) Poznámky: Daný entitní typ (tabulka) může mít více klíčů. Například (i) rodné číslo, (ii) osobní číslo zaměstnance, (iii) syntetický klíč. Každá tabulka má alespoň jeden klíč. V (opravdové) relační databázi tabulka běžně neobsahuje více řádků s týmiž hodnotami v jednotlivých sloupcích (pokud ano, ve většině případů je to chyba). Osobní číslo Rodné číslo Jméno Příjmení Datum narození Jméno Příjmení Datum narození 101 8811010033 Josef Novák 01.11.1988 Josef Novák 01.11.1988 101 8811010033 Josef Novák 01.11.1988
Relační databáze - Cizí klíč Cizí klíč: množina (může být i jednoprvková) atributů (sloupců), jejichž hodnota určuje hodnotu klíče jiné tabulky. Poznámky: 1. Datový typ jednotlivých atributů musí být kompatibilní s datovým typem odpovídajících atributů klíče referencované tabulky. 2. Cizí klíč není (nemusí být) v dané tabulce klíčem. 3. Vztah mezi entitami se realizuje asociativní vazbou cizí klíč -> primární klíč. 4. Vzhledem k tomu, že tabulka může mít více klíčů, je dobré jeden z nich zvolit a systematicky ho používat k realizaci vztahů s ostatními tabulkami. Takto zvolený klíč nazýváme klíčem primárním. Osobní číslo Rodné číslo Jméno Příjmení Datum narození 101 8811010033 Josef Novák 01.11.1988 Osobní číslo Popis Ráže 101 Kalašnikov 7,65 Rodné číslo SPZ Značka 8811010033 BE-04-30 Škoda
Referenční integrita Mějme dvě tabulky A a B takové, že tabulka B obsahuje cizí klíč odkazující to tabulky A. Referenční integrita je integritní omezení, které v databázi definuje (zajišťuje) vztah (souvislost) mezi cizím a primárním klíčem. Osoba Město V databázi nesmí dojít k tomu, že v nějakém řádku tabulky B odkazuje hodnota cizího klíče na neexistující řádek v tabulce A. V takovém případě jsou data nekonzistentní a v databázi bude docházet k problémům.
Referenční integrita Rodne_cislo Jmeno Prijmeni Osoba drzitel Vyrobni_cislo Vyrobce Typ Popis Strelna_zbran Osoba Zbran Rodne_cislo Jmeno Prijmeni Drzitel Vyrobni_cislo Vyrobce Typ Popis 1 Josef Novák 1 101 Zbrojovka Vzduchovka Slavie 2 Jaroslav Novotný 2 202 Zbrojovka Kalashnikov Vzor 57 Jak může dojít k porušení referenční integrity? a) Zrušíme záznam v tabulce Osoba => cizí klíč příslušného řádku tabulky Zbran bude odkazovat na neexistující řádek tabulky Osoba. b) Změníme hodnotu primárního klíče některého řádku v tabulce Osoba => cizí klíč příslušného řádku tabulky Zbran bude odkazovat na neexistující řádek tabulky Osoba.
Referenční integrita - Implementace Rodne_cislo Jmeno Prijmeni Osoba drzitel Vyrobni_cislo Vyrobce Typ Popis Strelna_zbran create table Strelna_zbran ( Vyrobni_cislo CHAR(10) not null, Vyrobce CHAR(10) not null, Rodne_cislo CHAR(10) not null, Typ CHAR(10) null, Popis CHAR(10) null, constraint PK_STRELNA_ZBRAN primary key (Vyrobni_cislo, Vyrobce) constraint FK_STRELNA DRZITEL_OSOBA foreign key (Rodne_cislo) references Osoba (Rodne_cislo) on delete restrict on update restrict; );
Referenční integrita - Implementace constraint FK_STRELNA DRZITEL_OSOBA foreign key (Rodne_cislo) references Osoba (Rodne_cislo) on delete restrict on update restrict;
Transformace N:M vazby na 1:N vazby Konceptuální model Logický model
Slabý entitní typ VA30 Slabý entitní typ modeluje situaci, kdy jeden entitní typ je existenčně závislý na jiném entitním typu. ma-linky Příklad: Telefonní linky v organizaci 1 11111111 Nemocnice Motol 224 43 11111111 1111 Ústředna 22222222 Honda Motol 234 09 11111111 2920 Kardiocentrum 11111111 2101 Novorozenecké oddělení 22222222 1111 Recepce 22222222 6690 Prodej nových vozů Cizí klíč Cizí Primární klíč klíč
Slabý entitní typ logický model - motivace VA30 VARCHAR(30) DECIMAL(9,0) ma-linky FK_LINKY_RELATIONS_ORGANIZA 1 1 DECIMAL(9,0) CHAR(15) CHAR(20) <fk> Konceptuální model Logický model Při přidání vazby dojde k přidání cizího klíče, ale...
Slabý entitní typ logický model - motivace VA30 VARCHAR(30) DECIMAL(9,0) ma-linky Není to divné? Sloupec IČO tu máme 2x FK_LINKY_RELATIONS_ORGANIZA 1 1 DECIMAL(9,0) CHAR(15) CHAR(20) <fk> Konceptuální model Logický model Při přidání vazby dojde k přidání cizího klíče, ale...
Slabý entitní typ logický model - motivace VA30 VARCHAR(30) DECIMAL(9,0) ma-linky FK_LINKY_RELATIONS_ORGANIZA 1 1 DECIMAL(9,0) CHAR(15) CHAR(20) <fk> Konceptuální model Logický model Při přidání vazby dojde k přidání cizího klíče, ale...
ma-linky VA30 1 VA30 ma-linky VA30 Slabý entitní typ správná vazba
Slabý entitní typ správná vazba Řídící entitní typ VA30 VA30 ma-linky Slabý entitní typ ma-linky Identifikující vztah (vazba) 1 11111111 Nemocnice Motol 224 43 11111111 1111 Ústředna 22222222 Honda Motol 234 09 11111111 2920 Kardiocentrum 11111111 2101 Novorozenecké oddělení 22222222 1111 Recepce 22222222 6690 Prodej nových vozů
Slabý entitní typ Logický model VA30 VARCHAR(30) DECIMAL(9,0) ma-linky FK_LINKY_MA-LINKY_ORGANIZA DECIMAL(9,0) CHAR(15) CHAR(20) <pk,fk>
Slabý entitní typ SQL pro vytvoření create table ( not null, DECIMAL(9,0) not null, Uzivatel-jmeno CHAR(15) null, Uzivatel-prijmeni CHAR(20) null, constraint PK_LINKY primary key (, ) ); create table ( not null, Nazev VARCHAR(30) not null, DECIMAL(9,0) null, constraint PK_ORGANIZACE primary key () ); VARCHAR(30) DECIMAL(9,0) FK_LINKY_MA-LINKY_ORGANIZA DECIMAL(9,0) CHAR(15) CHAR(20) <pk,fk> alter table add constraint "FK_LINKY_MA-LINKY_ORGANIZA" foreign key () references () on delete restrict on update restrict;
Reflexivní vztah matka ma-matku Osoba Rodne-cislo Jmeno Prijemni DC10,0 dítě dítě FK_OSOBA_RELATIONS_OSOBA Rodne-cislo Oso_Rodne-cislo Jmeno Prijemni Osoba DECIMAL(10,0) DECIMAL(10,0) CHAR(15) CHAR(20) <fk> matka
Reflexivní vztah matka ma-matku Osoba Rodne-cislo Jmeno Prijemni DC10,0 dítě Reflexive mandatory reference A reflexive reference exists should not have a mandatory parent which could lead to inconsistent dítě joins. FK_OSOBA_RELATIONS_OSOBA Rodne-cislo Oso_Rodne-cislo Jmeno Prijemni Osoba DECIMAL(10,0) DECIMAL(10,0) CHAR(15) CHAR(20) <fk> matka
Reflexivní vztah dítě ma-matku Osoba Rodne-cislo Jmeno Prijemni DC10,0 matka Nepovinná hodnota cizího klíče matka FK_OSOBA_RELATIONS_OSOBA Rodne-cislo Oso_Rodne-cislo Jmeno Prijemni Osoba DECIMAL(10,0) DECIMAL(10,0) CHAR(15) CHAR(20) <fk> dítě
Reflexivní vztah dítě Nepovinná hodnota cizího klíče ma-matku Osoba Rodne-cislo Jmeno Prijemni DC10,0 matka create table Osoba ( Rodne_cislo DECIMAL(10,0) not null, Oso_Rodne_cislo DECIMAL(10,0) null, Jmeno CHAR(15) null, Prijmeni CHAR(20) null, constraint PK_OSOBA primary key (Rodne_cislo) ); alter table Osoba add constraint FK_OSOBA_RELATIONS_OSOBA foreign key (Oso_Rodne_c references Osoba ("Rodne-cislo") on delete restrict on update restrict;