Zarządzanie systemami informatycznymi Zarządzanie internetową bazą danych MySQL Bazy danych Koncepcja bazy danych Relacyjna baza danych Projektowanie internetowej bazy danych Koncepcja bazy danych Bazą danych nazywamy zbiór danych w postaci tabel oraz narzędzi stosowanych do gromadzenia, przekształcania oraz wyszukiwania danych. Tabelą w bazie danych nazywamy zbiór rekordów opisujących obiekty np. pracownicy zawierających informacje o tych obiektach w sposób ujednolicony. Rekord zwany także krotką lub wierszem, to pozioma struktura danych opisująca jeden obiekt. Rekord składa się z pól opisujących dokładnie cechy obiektu np. pojedynczego pracownika. Pole zwane także atrybutem lub kolumną, to struktura danych opisująca pojedynczą daną w rekordzie np. nazwisko pracownika. Klucz podstawowy (ang. primary key) zwany też kluczem głównym to jedno lub więcej pól, których wartość jednoznacznie identyfikuje każdy rekord w tabeli. Taka cecha klucza nazywana jest unikatowością. Klucz podstawowy służy do powiązania rekordów w jednej tabeli z rekordami z innej tabeli. Klucz podstawowy jest nazywany kluczem obcym, jeśli odwołuje się do innej tabeli. Na przykład, w bazie pracowników kluczem podstawowym może być numer ewidencyjny pracownika. Relacyjna baza danych Relacja Po podzieleniu danych na tabele i zdefiniowaniu pól kluczy podstawowych trzeba wprowadzić do systemu bazy danych informacje na temat sposobu poprawnego łączenia powiązanych danych w logiczną całość. W tym celu definiuje się relacje między tabelami. Typy relacji 1. relacja jeden-do-jednego W relacji jeden-do-jednego każdy rekord w tabeli A może mieć tylko jeden dopasowany rekord z tabeli B, i tak samo każdy rekord w tabeli B może mieć tylko jeden dopasowany rekord z tabeli A. Ten typ relacji spotyka się rzadko, ponieważ większość informacji powiązanych w ten sposób byłoby zawartych w jednej tabeli. Relacji jeden-do-jednego można używać do podziału tabeli z wieloma polami, do odizolowania części tabeli ze względów bezpieczeństwa, albo do przechowania informacji odnoszącej się tylko do podzbioru tabeli głównej. 2. Relacja jeden-do-wielu Relacja jeden-do-wielu jest najbardziej powszechnym typem relacji. W relacji jeden-do-wielu rekord w tabeli A może mieć wiele dopasowanych do niego rekordów z tabeli B, ale rekord w tabeli B ma tylko jeden dopasowany rekord w tabeli A. Relacje 3. Relacja wiele-do-wielu W relacji wiele-do-wielu, rekord w tabeli A może mieć wiele dopasowanych do niego rekordów z tabeli B i tak samo rekord w tabeli B może mieć wiele dopasowanych do niego rekordów z tabeli A. Jest to możliwe tylko przez zdefiniowanie trzeciej tabeli (nazywanej tabelą łącza), której klucz podstawowy składa się z dwóch pól kluczy obcych z tabel A i B. Relacja wiele-do-wielu jest w istocie dwiema relacjami jedendo-wielu z trzecią tabelą. Na przykład, tabele "Zamówienia" i "Produkty" są powiązane relacją wiele-do-wielu zdefiniowaną przez utworzenie dwóch relacji jedendo-wielu z tabelą "Pozycje zamówione". Przykład relacji Język SQL (ang. Structured Query Language) klasyfikacja zapytań ● ● ● ● Data Definition Language (DDL) – polecenia tworzenia i zarządzania strukturą bazy danych (CREATE, DROP, ALTER) Data Manipulation Language (DML) – polecenia zarządzania danymi (INSERT, UPDATE, DELETE) Data Control Language (DCL) – polecenia kontroli danych (GRANT, REVOKE, DENY) Data Querying Language (DQL) – polecenia kwerend danych (SELECT) Projektowanie internetowej bazy danych Baza danych powinna określać model obiektów świata realnego (np. klienci, zamówienia, książki) Unikać przechowywania redundantnych danych – Marnotrawstwo pamięci – Możliwość powstania anaomalii uaktualniania Zapisywać atomowe wartości kolumn Dobrać właściwe klucze, które zagwarantują unikalność rekordów Unikać tworzenia tabel z wieloma pustymi polami Architektura internetowej bazy danych 1 Przeglądarka 2 Serwer WWW 6 3 Interpreter PHP 5 Serwer MySQL 4 Stosowanie MySQL Uruchamianie bazy danych MySQL Definiowanie użytkowników i nadawanie przywilejów Usuwanie przywilejów Tworzenie tabel Wstawianie danych Wyszukiwanie danych Zmiany struktury i zawartości tabel Uruchomienie bazy MySQL Połącznie z bazą danych MySQL mysql -h nazwa_komputera -u identyfikator_uzytkonika – p np: > mysql -h localhost -u root -p tworzenie bazy danych: > create database nazwa_bazy; pokazanie utworzonych baz danych: > show databases; przejscie do bazy: >use nazwa_bazy; Poziomy przywilejów Polecenia GRANT i REVOKE służą do nadawania i odbierania użytkownikom MySQL praw na czterech poziomach uprzywilejowania: • globalny • baza danych • tabela • kolumna Definiowanie użytkowników GRANT przywileje [kolumny] ON obiekt TO identyfikator_uzytkownika [ IDENTYFIED BY 'haslo'] [REQUIRE opcje_ssl] [WITH [GRANT OPTION | ograniczenia] Utworzenie użytkownika mającego status administratora: mysql> grant all -> on * -> to robert identified by 'haslo' -> with grant option; Utworzenie użytkownika bez przywilejów mysql>grant usage -> on moja_baza. * -> to student identified by 'mnb123‘; Modyfikowanie przywilejów mysql> grant select, insert, update, delete, alter, drop ->on moja_baza.* ->to student Usunięcie części przywilejów: mysql> revoke alter, drop ->on moja_baza.* ->from student Typy przywilejów Typy przywilejów: • Nadawane zwykłym użytkownikom – SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP • Przywileje dla administratorów – FILE, LOCK TABLES, PROCESS, RELOAD, SHOW DATABASES, SHUTDOWN, SUPER • Przywileje specjalne – ALL PRIVILEGES, USAGE Usuwanie przywilejów REVOKE przywileje ON obiekt FROM identyfikator_uzytkownika usuwanie użytkownika - with grant option mysql>revoke all privileges, grant ->from student; usuwanie części przywilejów: mysql> revoke alter, create, drop ->on my_db.* ->from student; Tworzenie tabel bazy danych CREATE TABLE nazwa_tabeli(kolumny) np: create table klienci ( klientid int unsigned not null auto_increment primary key, nazwisko char(50) not null, adres char(100) not null, miejscowosc char(30) not null ); Aby pokazać utworzone tabele: mysql> show tables; Aby pokazać zawartość tabeli: mysql> describe klienci; Typy danych w MySQL Liczby całkowite: TINYINIT, SMALLINIT, MEDIUMINIT, INTEGER, BIGINIT Liczby zminnoprzecinkowe: FLOAT, DOUBLE (REAL), DECIMAL Data i czas: DATE, TIME, DATETIME, TIMESTAMP, YEAR Łańcuchy znaków: CHAR(M), VARCHAR(M) Dane binarne: TEXT, BLOB Wstawianie danych INSERT [INTO] nazwa_tabeli [ (kolumna1, kolumna2,..)] VALUES(wartosc1, wartosc2,...) np: insert into klienci values (3, 'Julia Kowalska', 'Wierzbowa 25', 'Warszawa'), (4, 'Adam Pawlak', 'Szeroka 1/47', 'Szczecin'), (5, 'Michalina Nowak', 'Zachodnia 357', 'Gliwice'); Wyszukiwanie danych SELECT [opcje] kolumna [INTO plik] FROM nazwy_tabel [WHERE warunek] [GROUP BY rodzaj_grupowania] [HAVING wartosc_funkcji] [ORDER BY porzadek_sortownia] [LIMIT limit] [PROCEDURE nazwa_procedury(argumenty)]; Wyszukiwanie danych Typy złączeń tabel • Kartezjański - wszystkie możliwe kombinacje połączeń wierszy łączonych tabel przez użycie przecinków oddzielających nazwy tabel, bez klauzuli WHERE • Full join – jak wyżej • Cross join – jak wyżej z klauzulą CROSS JOIN między nazwami tabel • Inner join – równoważne przecinkowi między nazwami tabel stosowane z WHERE (bez klauzuli WHERE staje się Full join) • Equi-join – stosowane z warunkiem zawierającym znak równości w celu wyszukania pasujących do siebie wierszy z różnych tabel, w SQL odpowiada mu klauzula WHERE • Left join/Right join – używane w celu wyszukiwania brakujących wartości Typy złączeń tabel • Inner join • Left join • Right join • Full join Wyszukiwanie w wielu tabelach Łączenie dwóch tabel Łączenie trzech tabel Szeregowanie danych w określonym porządku ORDER BY Agregowanie i grupowanie danych Funkcje agregujące: avg(kolumna)- wartość średnia count(kolumna) – ilość wartości niezerowych min(kolumna) - najmniejsza w kolumnie max(kolumna) - największa w kolumnie std(kolumna) - odchylenie standardowe sum(kolumna) – suma wartości w kolumnie Zmiany rekordów UPDATE nazwa_tabeli SET kolumna1=wyrażenie1, kolumna2=wyrażenie2 [WHERE warunek] [ORDER BY kryteria_porzadkowania] [LIMIT ilosc] np.: update klienci set adres='Olkuska 250' where klientid=4; Zmiany struktury tabel ALTER TABLE nazwa_tabeli zmiana [ , zmiana, ...] np. alter table zamowienia add podatek float(6.2) after wartosc; <-dodanie kolumny alter table zamowienia drop podatek; <-usuwanie kolumny alter table klienci modify nazwisko char(70) not null; <-zmiana typu kolumny Usuwanie elementów bazy danych Usuwanie rekordów: DELETE FROM tabela [WHERE warunek] [ORDER BY kolumny_sortowania] [LIMIT ilosc] np. delete from klienci where klientid=5; Usuwanie tabel: drop table nazwa_tabeli; Usuwanie całej bazy danych: drop database baza_danych; Administracja i funkcje zaawansowane MySQL System przywilejów Ochrona bazy danych Tworzenie kopii zapasowych bazy danych Ładowanie danych do tabeli z pliku Maszyny zapisu Transakcje Klucze obce Procedury składowane System przywilejów Systemowa baza danych mysql przechowuje w tabelach informacje o przywilejach wszystkich użytkowników zarejestrowanych do bazy i zmiany wywołane poleceniem GRANT Tabela user - globalne przywileje użytkowników Tabele db i host - przywileje dostępu do poszczególnych baz danych Tabele tables_priv i columns_priv – przywileje nadane na wskazane tabele i kolumny Aby odświeżyć zmienione przywileje należy przeładować bazę danych: flush privleges; z poziomu systemu: mysqladmin flush-privileges mysqladmin reload Ochrona bazy danych Nadawanie wszystkim użytkownikom haseł i odpowiednie ich ukrywanie Ustawianie przywilejów użytkowników na jak najbardziej ograniczone, tylko na ich potrzeby. Wszystkie dane pochodzące od użytkownika powinny podlegać weryfikacji. W przypadku przesyłania danych poufnych należy zastosować protokół SSL. Tworzenie kopii zapasowej bazy danych MySQL W katalogu bin serwera mysqldump -u root -p -–opt -–all-databases > /sciezka/do/kopii/wszystkie.sql zapisanie w pliku zrzutu wszystkie.sql wszystkich poleceń SQL niezbędnych do zrekonstruowania bazy danych. mysqlhotcopy database /sciezka/do/kopii LOAD DATA INFILE LOAD DATA INFILE "noweksiazki.txt" INTO TABLE ksiazki; Instrukcja pozwala na odczytanie danych z pliku noweksiazki.txt i zapisanie ich w tabeli ksiazki. Pola danych w pliku muszą być rozdzielone znakiem tabulacji, dane umieszczone w apostrofach, a każdy wiersz musi być zakończony znakiem nowego wiersza(\n). MySQL Maszyny zapisu Maszyna zapisu określa typ i sposób przechowywania tabeli: MyISAM – typ domyślny o indeksowo-sekwencyjnej metodzie dostępu, który jest standardową metodą zapisu plików i rekordów. Nie obsługuje transakcji i kluczy obcych. ISAM – typ jak powyżej, obecnie uznany za przestarzały MEMORY – zapisywanie tymczasowych tabel w pamięci (do pracy na danych tymczasowych) MERGE – cechy MyISAM, omija systemowe ograniczenie wielkości pliku BDB – tabele obsługujące transakcje (Berkeley DB) InnoDB – tabele obsługujące transakcje i klucze obce, działające szybciej od tabel BDB, w przypadku stosowania maszyny zapisu obsługującej transakcje jest to zalecany typ tabel. Zmiana typu tabeli: alter table zamowienia type=innodb; Transakcje Transakcje to mechanizm pomagający w utrzymaniu spójności danych, szczególnie w przypadku wystąpienia błędu bądź załamania serwera. Transakcją jest zapytanie lub seria zapytań, dla których zagwarantowane jest, że zostaną wykonane w całości, lub też w całości niewykonane. Transakcje muszą spełniać normy ACID: atomowość – transakcja musi być wykonana w całości lub nie wykonana wogóle spójność – transakcja powinna pozostawić spójną bazę danych izolacja – operacja do zakończenia transakcji powinna być odizolowana od bazy trwałość – po zapisaniu w bazie danych transakcja powinna być trwała Uruchamianie transakcji w InnoDB Wyłączenie domyślnego, automatycznego zatwierdzania dla sesji: set autocommit=0; Jeżeli automatyczne zatwierdzanie jest włączone, każdą transakcję należy zaczynać instrukcją: start transaction; Aby zatwierdzić instrukcje składające się na transakcję nalaży wpisać: commit; Czynność można cofnąć przed wydaniem commit poleceniem : rollback; Klucze obce Mechanizm kluczy obcych dostępny jest w tabelach typu MyISAM i InnoDB Klucze obce mogą być traktowane tak samo jak klucze główne i będą wymagały podawania właściwych wartości zgodnych z numeracją tego klucza Tabele typu InnoDB wprzeciwieństwie do MyISAM kontrolują integralność kluczy obcych. np. >alter table pozycje_zamowione add foreign key (zamowienieid) references zamowienia(zamowienieid); Kolumna zamowienieid staje się kluczem obcym na podstawie klucza głownego tabeli zamowienia w kolumnie o tej samej nazwie. Klucze obce Przykład nadania klucza obcego dla pola zamowieniaid i próba wpisania wartości do tego pola. W przypadku tabeli InnoDB takie działanie jest niedozwolone, w przeciwieństwie do MyISAM. Procedury składowane Procedura składowana jest podprogramem utworzonym i zapisanym w MySQL. #Przykład prostej procedury skladowanej delimiter// create procedure suma_zamowien(out suma float) BEGIN select sum(wartosc) into suma from zamowienia; END // delimiter; #Uruchomienie procedury call suma_zamowienia(@t); Funkcje składowane #Przykładowa funkcja delimiter // create function dodaj_podatek(cena float) returns float return cena*1.22; // delimiter ; #uruchomienie funkcji select dodaj_podatek(100); Łączenie z bazą danych mysqli_connect(servername,username,password,dbname); new mysqli (servername,username,password,dbname); $con = mysqli_connect("localhost","peter","abc123”, ”mydb”); lub $con = new mysqli ("localhost","peter","abc123”, ”mydb”); if (!$con) { die(”Nie mogę nawiązać połączenia.” ); } Połączenie z PostgreSQL: $dbconn = pg_connect ("host=localhost port=5432 dbname=testdb user=lamb password=foo"); Pobieranie danych z bazy danych Wybór bazy danych: mysqli_selecet_db($db, nazwa_bazy); $db ->select_db(nazwa_bazy); Wysłanie zapytania: $wynik = mysqli_query($db, $zapytanie); $wynik=$db->query($zapytanie); Wersja PostgreSQL: $wynik = pg_query($dbconn, $zapytanie); Odczytanie rezultatu zapytania Wersja proceduralna: $wiersz = mysqli_fetch_assoc($wynik); //tablica asocjacyjna $wiersz = mysqli_fetch_row($wynik); //tablica numeryczna $wiersz = mysqli_fetch_array($wynik); //obie tablice Wersja obiektowa: $wiersz = $wynik->fetch_assoc(); $wiersz = $wynik->fetch_row(); $wiersz = $wynik->fetch_array(); Wersja PostgreSQL: $wiersz = pg_fetch_assoc($wynik); $wiersz = pg_fetch_row($wynik); $wiersz = pg_fetch_array($wynik); Zamykanie połączenia z bazą danych mysqli_free_result($wynik); $wynik -> free(); mysqli_close($db); $db->close(); pg_close($dbconn); Przykład- Pobieranie danych z bazy <?php $db = mysqli_connect("localhost", "student", "student", "test"); if(!$db) { die('<p><strong>Nie można odczytać danych w tej chwili</strong></p></body></html>'); } $zapytanie = "select * from posty"; $wynik = mysqli_query($db, $zapytanie); //obliczenie ilosci pobranych rekordów $ilosc_pozycji= mysqli_num_rows($wynik); if($ilosc_pozycji==0){ echo '<p>Brak postów</p>'; }else { for($i=0; $i<$ilosc_pozycji && $i<3; $i++){ $wiersz=mysqli_fetch_assoc($wynik); echo '<div id="posty"><p >'.stripslashes($wiersz['data']). '</p><p> '.stripslashes($wiersz['temat']). '</p> <p> '.stripslashes($wiersz['tresc']). '</p> <p>'.stripslashes($wiersz['autor']). '</p> </div>'; } } mysqli_free_result($wynik); mysqli_close($db); ?> Wpisywanie danych do bazy @ $db = mysqli_connect('localhost', 'student', 'student', 'test'); if(!$db) { die('<p><strong>Nie można zarejestrować w tej chwili</strong></p></body></html>'); } //wysyłanie zapytania $zapytanie = "insert into posty(data, autor, temat, tresc) values('".$data."','".$autor."','".$temat."','".$tresc."')"; $wynik = mysqli_query($db, $zapytanie); if($wynik) echo '<div id="one">Post został dodany: '.mysqli_affected_rows($db).'</div>'; mysqli_close($db); Włączenie obsługi PHP w serwerze Apache W pliku konfiguracyjnym Apache: LoadModule php5_module "C:\php\php5apache2_4.dll" AddHandler application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:\php" ; http://php.net/extension-dir ; extension_dir = "./" ; On windows: extension_dir = "C:\php\ext" Włączenie obsługi baz danych w interpreterze PHP Usunąć komnetarz w postci ';' dla MySQL: extension=php_mysql.dll extension=php_mysqli.dll Dla PostgreSQL: extension=php_pgsql.dll