Relacyjne bazy danych to nic strasznego.doc

(49 KB) Pobierz
Relacyjne bazy danych to nic strasznego

Relacyjne bazy danych to nic strasznego!!!

autor:Roman Korczyński

Kiepsko zaprojektowana baza danych to najczęściej spotykany błąd programistów, którzy dopiero zaczynają swoją przygodę z łączeniem PHP i MySQL. W poniższym artykule przedstawię bardzo prosty przykład relacji, oraz korzyści jakie płyną ze stosowania relayjnego modelu bazy.

Cóż to takiego są te relacje. Otóż w kilki słowach (a nie chcę się na ten temat rozpisywac) są to połączenia pomiędzy tabelami bazy oparte o unikatowy klucz. Połączenie takie (relacja) pozwala zatem odwołac się zapytaniem SQL do pól dwóch różnych tabel w oparciu o klucze. Aby bardziej zobrazowac tą ciężką do zrozumienia kwestię poniżej przedstawiam model relacyjny bazy składającej się jedynie z dwóch tabel: klienci, oraz adresy.



Tak wygląda składnia SQL tworząca obie tabele. Dodanie do nich przykładowych danych pozostawiam Tobie:

CREATE TABLE `klienci` (`id` INT (3) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT, `imie` CHAR (12) DEFAULT '0', `nazwisko` CHAR (25) DEFAULT '0', `e-mail` CHAR (25) DEFAULT '0', PRIMARY KEY(`id`), UNIQUE(`id`), INDEX(`id`))

CREATE TABLE `adresy` (`id` INT (3) UNSIGNED DEFAULT '0' NOT NULL AUTO_INCREMENT, `ulica` CHAR (30) DEFAULT '0', `miejscowosc` CHAR (30) DEFAULT '0', `kod` CHAR (6) DEFAULT '0', PRIMARY KEY(`id`), UNIQUE(`id`), INDEX(`id`))


Najistotniejsze pola w tych tabelach to pola "id" będące kluczami. Poniżej właściwości klucza, które uznałem za niezbędne:

·  `id` INT (3) całkowity

·  NOT NULL nie brzybierający wartości pustej

·  AUTO_INCREMENT samo zwiększający

·  PRIMARY KEY(`id`) kluczowy

·  UNIQUE(`id`) unikalny

·  INDEX(`id`) indeksowalny

Przy nie stosowaniu relacji nasza jedna tabela zawierałaby pola :imie, nazwisko, email, ulica, miejscowosc i kod. Jest to co prawda prostsze rozwiązanie i z powodzeniem stosuje się gdy mamy do czynienia z niewielką bazą. Dobrym nawykiem jest jednak stosowac relacje jako metodę optymalizacji bazy. I tak przykładowa relacja pomiędzy kluczami id tabel : klienci i adresy pozwala na odwołanie się jednym zapytaniem SQL do pól obu tabel. Łatwo sobie wyobrazic co dzieje się gdy mamy bazę np. towarów, z których każda grupa towarów ma osobne właściwości. Powstaje tabela o bardzo wielu polach, lub odwoływanie się do tabel właściwości jest bardzo kłopotliwe. Kiedy dołożymny do tego więcej niż 100000 rekordów to system zaczyna nabierac na wadze i traci efektywnośc.

Składnia SQL zapytania SELECT dla tabel połączonych relacją wygląda następująco:

$zapytanie = "SELECT * from klienci INNER JOIN adresy ON klienci.id=adresy.id";
$wykonaj = mysql_query ($zapytanie);


if (!$wykonaj)
{
echo "
Błąd zapytania->$zapytanie";}
else
{
$wiersz = mysql_fetch_array($wykonaj);
echo $wiersz[imie];
echo $wiersz[miejscowosc];
}

Po więcej informacji odsyłam do manuala MySQL , gdzie opisane są dokładnie relacje left join, right join, use index itd.

Mam tylko nadzieję, że relacje nie są już dla Ciebie czarną magią. Należy jednak pamiętac o normalizacji bazy danych. Usunięcie rekordu z tabeli klienci musi byc powiązane z usunięciem odpowiadającego rekordu w tabeli adresy. Taka sama sytuacja ma miejsce w przypadku modyfikacji danych.

Zgłoś jeśli naruszono regulamin