Relační databázová technologie Klíč: množina (možná jednoprvková) atributů (sloupců), jež jednoznačně idetifikuje danou entitu. Poznámky: 1. Daný entitní typ (tabulka) může mít více klíčů. Například (i) rodnéčíslo, (ii) osobníčíslo zaměstnance, (iii) syntetický klíč. 2. Každá tabulka má alespoň jeden klíč. V (opravdové) relační databázi nemůže tabulka obsahovat více řádků s týmiž hodnotami v jednortlivých sloupcích. Osobní číslo Rodné číslo Jméno Příjmení Datum narození Jméno Příjmení Datum narození 101 8811010033 Josef Novák 1.11.1988 Josef Novák 1.11.1988 101 8811010033 Josef Novák 1.11.1988
Relační databázová technologie Cizí klíč: množina (možná 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 atrinutů klíče referencované tabulky. 2. Cizí klíč není (nemusí být) v dané tabulce klíčem (jednoznačnost). 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 1.11.1988 Osobní číslo Popis Ráže 101 Kalašnikov 7,65 Rodné číslo SPZ Značka 8811010033 BE-04-30 Škoda
http://www.sybase.com/products/modelingmetadata/powerdesigner
Převod konceptuální model -> logický model Entitní typ -> tabulka Atribut entitního typu -> sloupec tabulky Vztah: 1:1 nebo 1:N: vztah->cizí klíč na straně N atribut vztahu -> sloupec tabulky na straně N N:M: Vztah -> vazební tabulka Atribut vztahu -> sloupec vazební tabulky
DC8,0 VA30 Slabý entitní typ 1 Notace Crow's Foot VARCHAR(30) ma-linky FK_LINKY_RELATIONS_ORGANIZA 1 DC8,0 1 CHAR(15) CHAR(20) <fk> 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ů
DC8,0 VA30 Slabý entitní typ 1 Notace Crow's Foot VARCHAR(30) ma-linky FK_LINKY_RELATIONS_ORGANIZA 1 Není to divné? Sloupec IČO tu máme 2x DC8,0 1 CHAR(15) CHAR(20) <fk> 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ů Tento sloupec tu bude 2x Cizí klíč Cizí Primární klíč
DC8,0 VA30 Slabý entitní typ 1 Notace Crow's Foot VARCHAR(30) ma-linky FK_LINKY_RELATIONS_ORGANIZA 1 Není to divné? Sloupec IČO tu máme 2x DC8,0 1 CHAR(15) CHAR(20) <fk> 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ů Tento sloupec tu bude 2x Cizí klíč Cizí Primární klíč
Slabý entitní typ 2 DC8,0 VA30 DC8,0 VA30 ma-linky ma-linky 1 DC8,0 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ů
Řídící entitní typ Slabý entitní typ 2 DC8,0 VA30 DC8,0 VA30 ma-linky Slabý entitní typ ma-linky Identifikující vztah (vazba) 1 DC8,0 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 3 DC8,0 VA30 VARCHAR(30) ma-linky FK_LINKY_MA-LINKY_ORGANIZA CHAR(15) CHAR(20) <pk,fk>
Slabý entitní typ 4 VARCHAR(30) create table ( not null, 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, null, constraint PK_ORGANIZACE primary key () ); FK_LINKY_MA-LINKY_ORGANIZA 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 1 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 2 Rodne-cislo Jmeno Prijemni dítě Osoba DC10,0 ma-matku matka Nepovinná hodnota cizího klíče 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, matka FK_OSOBA_RELATIONS_OSOBA constraint PK_OSOBA primary key (Rodne_cislo) ); Osoba alter table Osoba add constraint FK_OSOBA_RELATIONS_OSOBA Rodne-cislo DECIMAL(10,0) foreign key (Oso_Rodne_cislo) dítě references Osoba ("Rodne-cislo") Oso_Rodne-cislo DECIMAL(10,0) <fk> on delete restrict on Jmeno update restrict; CHAR(15) Prijemni CHAR(20)
Reflexivní vztah 2 dítě Osoba ma-matku create Rodne-cislo table Osoba DC10,0 ( Rodne_cislo Jmeno DECIMAL(10,0) not matka null, Oso_Rodne_cislo Prijemni DECIMAL(10,0) null, Jmeno CHAR(15) null, Prijmeni CHAR(20) null, constraint PK_OSOBA primary key (Rodne_cislo) ); matka FK_OSOBA_RELATIONS_OSOBA alter table Osoba add constraint FK_OSOBA_RELATIONS_OSOBA foreign key (Oso_Rodne_cislo) references Osoba ("Rodne-cislo") Osoba on delete restrict on Rodne-cislo update restrict; DECIMAL(10,0) dítě Oso_Rodne-cislo DECIMAL(10,0) <fk> Jmeno CHAR(15) Prijemni CHAR(20)
Referenční integrita 1 Mějme dvě tabulky A a B takové, že tabulka B obsahuje cizí klíč odkazující to tabulky A. V databázi nesmí dojít k tomu, že pro nějaký řádek tabulky B odkazuje jeho hodnota cizího klíče na neexistujícířádek tabulky A.
Referenční integrita 2 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 3 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 4 constraint FK_STRELNA DRZITEL_OSOBA foreign key (Rodne_cislo) references Osoba (Rodne_cislo) on delete restrict on update restrict; Proč disabled? Proč disabled? Protože mandatory parent