Konceptuální modelování a SQL přednáška č.? 1/90
Vytváření IS Analýza Návrh Implementace Testování Předání SW Jednotlivé fáze mezi sebou iterují 2/90
Proč modelovat/analyzovat? Standardizované pracovní postupy Snadnější komunikace v týmu Aktuální a kompletní dokumentace 3/90
Fáze návrhu databáze Požadavky na uložená data Konceptuální návrh Konceptuální schéma (ERD) Logický návrh Logické schéma (tabulky) Fyzický návrh Fyzické schéma Uložené záznamy Přístupové metody 4/53
Funkční analýza Analýza DFD Data Flow Diagram Datová analýza ER Model Entity Relationship Model ERD (Entity-Relationship Diagram) Peter Chen in 1976 5/90
Vztah E-R a DFD Kontextový diagram DFD 1. úroveň ERA diagram DFD n-tá úroveň Definice všech datových prvků Specifikace procesů popis všech funkcí s uvedením na datové prvky a s popisem podmínek vykonání funkcí 6/90
Funkční analýza Identifikace systémových funkcí Identifikace událostí Definice transakcí Popis transakcí 7/90
DFD Data Flow Diagram Stavební prvky DFD Proces 1 Název Terminátor Název Datový tok Název Úložiště dat Název 8/90
DFD Top-Down Postup Používáme postup Shora dolů Úrovně: 1. Kontextový diagram inf. o tom jak bude IS komunikovat se zbytkem světa 2.- n-tá další postupné rozklady (max. doporučená hodnota n je 3) Vhodná jmenná konvence 9/90
Chyby DFD datastory, z nichž se jenom čte nebo se do nich jenom zapisuje samogenerující funkce, tj. funkce které mají jenom výstupy černé díry, tj. funkce do nichž data pouze vstupují 10/90
Seznam událostí p.č. Název události Typ Reakce systému 1. Dílna žádá materiál Data Vyhledá mat., vystaví výdejku 2. Sklad nemá dostatek materiálu Řídící Vystaví objednávku 3. Dodavatel dodá materiál Data Přijme mat., potvrdí dodací list 4. Je první den v měsíci Řídící datum Vytvoří přehled o spotřebě 11/90
Jednoduchý příklad kontextového diagramu Dílna Dodavatel Sklad Management 12/90
Upřesněný kontextový diagram Žádanka Dodavatel Objednávka Dodací list Sklad Výdejka Dílna Přehled spotřeby Management 13/90
Další úrovně rozkladu - sklad Objednávka Žádanka Výdejka Objednávání Materiál Výdej mat. Mat. dodavatel Databáze Zásoba mat. Příjem mat. Mat. Skladové zásoby Tvorba přehledů Přehled spotřeby 14/90
ER Model Cílem je vytvořit datový model postihující určitou část světa Svět je chápán jako množina objektů (entit) a vztahů mezi nimi říkáme ER diagram ERA diagram ještě přidává atributy Vytváříme Konceptuální schéma (nezávisle na DB modelu -relační, síťový, ) 15/90
Postup návrhu databáze Entitní množiny a vztahy Prvotní schéma Osoba (rč,jméno,příjmení,vzdělání, děti, Normalizované schéma Osoba (rč,jméno,příjmení, ) Vzdelani (název, ) Normalizace Návrh fyzické organizace db (indexy, tabulkové prostory, Vytvoření databázových objektů CREATE TABLE Osoba (rč int not null, Jméno varchar(15) NULL, CREATE INDEX irc on Osoba 16/53
Entitní množiny a vztahy Prvotní schéma Produkt(nazev,lokalita,parametry, ) Normalizované schéma Produkt(nazev) Lokalita(nazev,misto,parametry, ) Normalizace Návrh fyzické organizace databáze (indexy, tabulkové prostory, Vytvoření databázových objektů CREATE TABLE Produkt (nazev varchar(15) NULL, CREATE INDEX inazev on Produkt 17/53
SQL Structured Query Language
SQL SEQUEL-XRM, IBM v roce 1974 Neprocedurální jazyk říkáme co chceme, ne jak to provést Standardem od roku 1986 jako SQL86.. 19
Interakční a hostitelská verze Interakční příkazy lze zadávat přímo v režimu on-line Hostitelská SQL je součástí hostitelského jazyka, např. C, Java, PHP, ASP, 20
Spouště DML Řízení transakcí Vložené a dynamické SQL SQL DDL Integritní omezení Bezpečnost Přístupová práva 21
Vytvoření relace CREATE TABLE jméno_relace (atribut datový_typ [NOT NULL[UNIQUE]] [, atribut datový_typ [NOT NULL [UNIQUE]]...] [,UNIQUE seznam_atributů]) CREATE TABLE osoby ( jmeno varchar(25), prijmeni varchar(25), vek integer)
Datové typy v SQL Přesné numerické typy INTEGER, DECIMAL(p,q) Aproximativní numerické typy FLOAT, REAL Znakové řetězce CHARACTER(n), CHARACTER VARYING(n) řetězec o maximální délce n
Datové typy v SQL Datové typy Integer celé číslo se znaménkem; Decimal(p,q) číslo s p ciframi a desetinou čárkou na q pozici zprava; Float reálné číslo; Char(n) řetězec znaků délky n; Varchar(n) řetězec znaků max. délky n; Standartní: Numeric, Real, Double precision, Smallint; Nestandarní: Date,Money, geometric types
CHECK DEFAULT FOREIGN KEY PRIMARY KEY NOT NULL Integritní omezení - kontrola vstupních dat - výchozí hodnota - definice cizího klíče - definice primárního klíče -sloupec nesmí mít hodnotu NULL UNIQUE -všechny hodnoty ve sloupci/ích musí být unikátní, NULL je přípustné
NULL hodnota Předpoklad že vždy známe hodnotu atributu je velmi silný a v reálném světě nereálný Hodnoty atributů mohou být neznámé (nevíme do vložit) SQL na toto pamatuje hodnotou NULL
NULL hodnota II. NULL použije tehdy, pokud je hodnota atributu: Neznámá Neaplikovatelná NULL není 0 ani mezera!! NOT NULL IO nepřipouští ani vložení NULL hodnoty do sloupce
CHECK Jedná se integritní omezení na atributu SQL92 = umožňuje definovat CHECK na více atributech, či dokonce pro více tabulek CHECK specifikuje Boolean podmínku (TRUE, FALSE, nebo neznámé), která se aplikuje na všechny hodnoty do atributu vložené Pokud FALSE, pak je dotaz odmítnut Lze specifikovat i vícenásobný CHECK pro každý atribut JEDNÁ SE O DOMÉNOVÉ OMEZENÍ 28
Příklad CHECK CREATE TABLE my_table( int_column INTEGER, char_column VARCHAR(55), pocet INTEGER NOT NULL, PRIMARY KEY(int_column), CHECK (pocet >=1 AND pocet<=10)) 29
Příklad CHECK II CREATE TABLE cust_sample ( cust_id int PRIMARY KEY, cust_name char(50), cust_address char(50), cust_credit_limit money, CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000), CONSTRAINT chk_cust_credit_limit CHECK (cust_credit_limit>= 15000 AND cust_credit_limit <= 100000) ) 30
Příklad CHECK III CREATE TABLE my_table( id_mytable INTEGER, trida VARCHAR(55), PRIMARY KEY(id_mytable), CONSTRAINT CK_no_myclass CHECK ( dbs <> SELECT trida.jmeno FROM trida WHERE trida.id_trida = my_table.trida)) 31
UNIQUE UNIQUE zajistí, že se nebudou vyskytovat žádné duplikáty v atributu, který není součástí primárního klíče UNIQUE je vhodné použít tam, kde chce mít atribut/y bez duplicit, které nejsou součástí primárního klíče. Na rozdíl od PRIMARY KEY, UNIQUE dovolí vložit NULL do hodnoty atributu Pouze jedna NULL hodnota je však dovolena v rámci atributu!!! 32
PRIMARY KEY Definuje atribut/atributy, které tvoří primární klíč Pouze jeden pro tabulku Nelze do takového atributu/ů vložit NULL hodnotu Když je specifikován PRIMARY KEY, SQL Server 2005 Database Engine zajistí unikátnost dat tím, že založí unique index pro atribut/y primárního klíče. Index zároveň urychluje přístup k atributům primárního klíče 33
Pro více atributů Pokud je PRIMARY KEY definován pro více atributů, je možné, aby se hodnota opakovala v jednom z nich, ale kombinace musí být unikátní. 34
Příklad CREATE TABLE part_sample ( part_nmbr int PRIMARY KEY, part_name char(30), part_weight decimal(6,2), part_color char(15)primary KEY ); 35
DEFAULT Pomocí DEFAULT lze zadat výchozí hodnotu atributu Pokud tedy uživatel nezadaná hodnotu bude takto definovaný atribut mít hodnotu definovanou pomocí DEFAULT
Příklad DEFAULT CREATE TABLE my_table( id_mytable INTEGER, pocet INTEGER DEFAULT 0, trida VARCHAR(55) DEFAULT N/A, PRIMARY KEY(id_mytable)) 37
FOREIGN KEY Pomocí FOREIGN KEY definujeme vazbu mezi dvěma entitami - referenční integritu
Referenční integrita Referenční integrita definuje logické vazby (vztahy) mezi tabulkami Osoba Id_os jmeno prijmeni datum_n id_os primární klíč tabulky Osoba 11 23 Karel Petr Omáčka Rýha 1.10.1978 19.4.1980 Tridni cizí klíč tabulky Trida Trida Nazev tridni zaku rocnik A4A 11 23 4 A3 23 22 3
SQL CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int FOREIGN KEY FK_osoba REFERENCES Osoba(id_os); 40
Referenční integrita Jedná se o provázání dvou tabulek pomocí odkazu z vedlejší tabulky do tabulky hlavní Osoba Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 23 Petr Rýha 19.4.1980 Trida Nazev tridni zaku rocnik A4A 11 23 4 A3 22 22 3
Referenční integrita Pomocí referenční integrity se lze odkazovat i v rámci jedné tabulky = self relace S výhodou lze použít například pro definic vztahu dokument a přílohy dokumentů, kdy přílohy jsou opět dokumenty 42
Příklad na self-relaci Co je v daném schématu primární klíč? Co je cizí klíč? doc_id title size attachment 13 Doc 1: Zpráva 07 100 NULL 15 Příloha 1 200 13 18 Příloha 2 40 13 43
SQL CREATE TABLE Doc ( doc_id int PRIMARY KEY, title varchar(20), Size int, attachment int FOREIGN KEY FK_attachment REFERENCES Doc(doc_id) ); 44
Referenční integrita pro operace SQL92 Definována pro operace: INSERT UPDATE DELETE 45
INSERT Vkládání řádků do závislé tabulky Operace není povolena pokud pro hodnotu K cizího klíče neexistuje odpovídající řádek v hlavní tabulce, kde K je hodnota primárního klíče Id_os jmeno prijmeni datum_n Osoba hlavní tabulka 11 Karel Omáčka 1.10.1978 Trida závislá tabulka 23 Petr Rýha 19.4.1980 Osoba Nazev tridni Trida zaku rocnik A4A 11 23 4 46 A3 23 22 3
INSERT Je tedy v pořádku následující příklad? Osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 23 Petr Rýha 19.4.1980 Trida Nazev tridni zaku rocnik A4A 11 23 4 47 A3 22 22 3
INSERT A co v tomto případě? Osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 11 Petr Rýha 19.4.1980 Trida Nazev tridni zaku rocnik A4A 11 23 4 A3 22 22 3 48
INSERT A teď? Osoba Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 21 Petr Rýha 19.4.1980 Trida Nazev tridni zaku rocnik A4A 11 23 4 A3 11 22 3 49
DELETE - ON DELETE CASCADE Kaskádové odstranění řádků ON DELETE CASCADE Při odstranění záznamu z hlavní tabulky s hodnotou primárního klíče K se odstraní i záznamy v tabulce vedlejší s hodnotou K v cizím klíči Id_os 11 23 jmeno Karel Petr prijmeni Omáčka Rýha datum_n 1.10.1978 19.4.1980 Osoba hlavní tabulka Trida závislá tabulka Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 23 22 3 50
DELETE - ON DELETE CASCADE Co se stane pokud mažu záznam A4A z tabulky trida? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 23 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 23 22 3 51
DELETE - ON DELETE CASCADE Co se stane pokud mažu záznam 22 z tab. osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 22 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 11 22 3 52
SQL CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int FOREIGN KEY FK_osoba REFERENCES Osoba(id_os) ON DELETE CASCADE; 53
DELETE - SET NULL Nahrazení cizího klíče pomocí NULL SET NULL Odpovídající hodnoty cizích klíčů v závislé tabulce se nahradí hodnotou NULL Id_os 11 jmeno Karel prijmeni Omáčka datum_n 1.10.1978 Osoba hlavní tabulka 23 Petr Rýha 19.4.1980 Trida závislá tabulka Trida Osoba Nazev A4A tridni NULL zaku 23 rocnik 4 A3 23 22 3 54
DELETE - SET NULL Co se stane pokud mažu záznam A4A z tabulky trida? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 23 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 23 22 3 55
DELETE - SET NULL Co se stane pokud mažu záznam 22 z tab. osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 22 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 11 22 3 56
DELETE - SET NULL Co se stane pokud mažu záznam 11 z tab. osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 22 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni 11 zaku 23 rocnik 4 A3 11 22 3 57
DELETE - SET NULL Co se stane pokud mažu záznam 11 z tab. osoba? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 22 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni NULL zaku 23 rocnik 4 A3 NULL 22 3 58
SQL CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int FOREIGN KEY FK_Osoba REFERENCES Osoba(id_os) ON DELETE SET NULL; 59
DELETE - SET DEFAULT Nahrazení hodnoty cizího klíče DEFAULT hodnotou SET DEFAULT Hodnota cizího klíče se nahradí výchozí hodnotou v definici atributu/ů cizího klíče 60
DELETE - SET DEFAULT Jak je definovaná tabulka Osoba? A jak je to s tabulkou Trida? Id_os jmeno prijmeni datum_n 11 Karel Omáčka 1.10.1978 22 Petr Rýha 19.4.1980 Trida Osoba Nazev A4A tridni NULL zaku 23 rocnik 4 A3 NULL 22 3 61
SQL CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) 62
SQL CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int DEFAULT null FOREIGN KEY FK_Osoba REFERENCES Osoba(id_os) ON DELETE SET DEFAULT; 63
DELETE Odstranění záznamů z hlavní tabulky s upozorněním NO ACTION operace se neprovede, pokud pro hodnotu primárního klíče v hlavní tabulce existují záznamy v tabulce vedlejší NO ACTION je výchozí hodnota t.z. že pokud se neuvede nic pak je NO ACTION 64
SQL CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int FOREIGN KEY FK_Osoba REFERENCES Osoba(id_os) ON DELETE NO ACTION; 65
UPDATE Pro UPADTE platí to samé jako pro DELETE 66
SQL např. CREATE TABLE Osoba ( id_os int, Jmeno varchar(35), Prijmeni varchar(35), Datum_n datetime ) CREATE TABLE Trida ( nazev varchar(20), zaku int, Rocnik int, tridni int FOREIGN KEY FK_Osoba REFERENCES Osoba(id_os) ON UPDATE NO ACTION ON DELETE SET DEFAULT; 67
Konec. 68/53