260 PHP i MySQL dla każdego
Tabela Autorzy ma zatem pola: Autorld, Imię, Nazwisko, natomiast tabela Książki cztery: Książkald, Tytuł, Autorlld, Autor2Id, Autor3Id. Takie rozwiązanie, choć spotykane w praktyce, ma jednak wiele wad i należy go zdecydowanie unikać. Po pierwsze większość książek ma tylko jednego autora, a zatem w większości przypadków pola Autor2Id i Autor3Id pozostaną puste. Takie puste pola mogą nam potem sprawić trochę kłopotów przy obsłudze bazy. Po drugie może się zdarzyć sytuacja wyjątkowa, kiedy to jakaś książka będzie miała więcej niż trzech autorów i wtedy nie będziemy w stanie zapisać ich wszystkich w bazie. Dlatego też w przypadku wystąpienia relacji wiele do wielu należy stosować dodatkową tabelę pomocniczą łączącą tabele, między którymi relacja występuje. Prawidłowe rozwiązanie jest zatem takie, jak na rysunku 9.23.
Autorzy |
KsiążkiAutorzy |
Książki | ||
Autorld |
Książkald |
Książkald | ||
Imię |
Autorld |
Tytuł | ||
Nazwisko |
Rysunek 9.23.
Prawidłowe rozbicie relacji wiele do wielu na trzy tabele
Tabela Autorzy ma taką samą postać, jak w poprzednim przypadku, natomiast tabela Książki tym razem ma tylko dwa pola: Książkald (które będzie przechowywać unikalny identyfikator) oraz Tytuł. Za połączenia autorów i książek odpowiada natomiast całkiem nowa tabela, o nazwie Książki Autorzy. Ma ona dwa pola, w pierwszym polu — Książkald — zapisywane są identyfikatory książek z tabeli Książki (jest to więc klucz obcy), w drugim polu — Autorld — zapisywane są identyfikatory autorów z tabeli Autorzy (a zatem to również jest klucz obcy). Dzięki takiemu układowi możemy bez problemu odzwierciedlić sytuacje, kiedy jeden autor napisał wiele książek i kiedy jedna książka ma więcej niż jednego autora. Taka przykładowa sytuacja została przedstawiona na rysunku 9.24. Zwróćmy także uwagę na to, że w tabeli KsiążkiAutorzy obie kolumny zawierają klucze obce, a zatem obie razem będą stanowić klucz podstawowy (o ile dane w tabeli nie zawierają błędów, para Książkald, Autorld jednoznacznie wyznacza dany wiersz tabeli KsiążkiAutorzy).
Rysunek 9.24.
Autorld |
Imię |
Nazwisko |
1 2 |
Orson Scott Kathryn |
Card Kidd |
Książką Id |
Tytuł |
1 |
Gra Endera |
2 |
Lovelock |
3 |
Paradise Vue |
KsiążkiAutorzy
Ksiażkald |
Autorld |
1 2 |
1 1 |
2 |
2 |
3 |
2 |
Baza książek i autorów zawierająca przykładowe dane
Widać wyraźnie, że bazie zapisano dane dwójki autorów: Orsona Scotta Carda2 oraz Kathryn Kidd3 (tabela Autorzy) oraz trzech książek: Gra Endera, Lovelock i Paradise Vue
' Godne rozważenia może być to, jak postępować w sytuacji, kiedy autor posługuje się dwoma imionami.
Czy zapisywać je oba, w jednej kolumnie, tak jak w przedstawionym przykładzie (zmieniając ewentualnie __ nazwę kolumny na Imiona), czy też zastosować inne rozwiązanie?
J Dokładniej Kathryn Helms Kidd, w polskim wydaniu książki Lovelock błędnie wydrukowano nazwisko Kathryn Kerr.