netcoffee.pl*po godzinach - reaktywacja

Ten blog jest kontynuacją bloga dostępnego ongiś pod adresem netcoffee.pl/pogodzinach.
Artykuły, które na to zasługują są przenoszone do nowej wersji bloga. Pozostałe wkrótce znikną.

2006-04-17

Zarządanie relacjami w phpMyAdmin

Jedną z mniej znanych funkcji phpMyAdmin jest zarządzanie relacjami w bazie danych. Na małą popularność tej opcji wpływa konieczność przeprowadzenia dodaktowej konfiguracji aby była ona widoczna.


phpMyAdmin informacje o relacjach między tabelami przechowuje w tabelach w zdefiniowanej bazie danych. Dlatego najlepiej jest utworzyć oddzielną bazę danych, tylko na potrzeby phpMyAdmin. Domyślna nazwa bazy to phpmyadmin.

Aby utworzyć tabele niezbędne do dzialania zaawansowanych funkcji phpMyAdmin, wystarczy uruchomić instrukcje SQL znajdujące się w pliku scripts/create_tables.sql w archiwum z phpMyAdmin. Skrypt ten zakłada, że istnieje użytkownik pma, z poziomu którego będzie odbywało się zarządanie danymi.

Skrypt:

  • usuwa bazę phpmyadmin (jeżeli istnieje)
  • zakłada ją ponownie
  • nadaje prawa do wykonywania SELECT, INSERT, UPDATE i DELETE użytkownikowi pma w bazie phpmyadmin
  • tworzy potrzebne tabele

Kolejnym krokiem jest uaktualnienie pliku config.inc.php. Dla każdego z używanych serwerów, należy podać wartość zmiennych:

# nazwa bazy danych phpMyAdmin
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';

# nazwa tabeli z opisem relacji
$cfg['Servers'][$i]['relation'] = 'pma_relation';

Po przeprowadzeniu tych operacji, w interfejsie phpMyAdmin zobaczymy nową opcję: Widok relacyjny w widoku struktury tabeli: Nowa opcja: widok relacyjny


Po wybraniu opcji "Widok relacyjny" otrzymujemy dostęp do formularza, w którym możemy zdefiniować relacje między tabelami:
Definiowanie relacji między tabelami


Dla każdego pola tabeli, możemy zdefiniować, któremu polu w innej tabeli odpowiada. Robimy to wybierając odpowiednie pole z listy rozwijalnej. Dodatkowo, dla każdej tabeli możemy wybrać, zawartość którego pola będzie pokazywana jako etykieta rekordu.


Dla przykładu rozważmy takie dwie tabele, zawierające dane menedżera projektów.


Tabela project

  • id - int(10)
  • name - char(100)

Tabela item

  • id - int(10)
  • project_id - int(10)
  • name - char(100)

W tabeli 'project' przechowujemy nazwy projektów, w tabeli 'item' - nazwy poszczególnych elementów projektów. Każdy 'item' ma przypisany także id projektu, do którego należy. Po wejściu do widoku relacyjnego tabeli 'item', dla pola 'project_id' należy wybrać pozycję 'project -> id' (co oznacza pole 'id' w tabeli 'project').


W widoku relacyjnym tabeli 'project' wybieramy wyświetlane pole: 'name'.


Dzięki temu, podczas edycji rekordu z tabeli 'item', zamiast pola tekstowego, dla 'id' zobaczymy listę rozwijalną, z której będzie można wybrać odpowiedni projekt:
Formularz edycji danych


W widoku tabeli danych, zawartość pól w kolumnie 'project_id' będzie odnośnikiem:
Widok tabeli danych
Po jego kliknięciu zobaczymy szczegóły odpowiedniego projektu.