Zrozumienie podstaw zarządzania schematami jest kluczowe dla budowania i utrzymywania efektywnej bazy danych PostgreSQL. W tym artykule przyjrzymy się tradycyjnemu sposobowi zarządzania schematem Postgresa oraz nowszemu, bardziej efektywnemu sposobowi, aby zrobić to w sposób wizualny, bez konieczności pisania jakiejkolwiek linijki kodu.
Co to jest schemat PostgreSQL?
Na początek, aby przygotować grunt pod artykuł, wyjaśnijmy sobie pewną terminologię. W Postgres, schemat jest również określany jako przestrzeń nazw. Przestrzeń nazw może być powiązana z nazwą rodziny. Jest on używany do identyfikacji i rozróżniania pewnych obiektów w bazie danych (tabel, widoków, kolumn, itp.). Nie jest dozwolone tworzenie dwóch tabel o tej samej nazwie w jednym schemacie, ale można to zrobić w dwóch różnych schematach. Na przykład, możemy mieć dwie tabele o nazwie table1 obecne w schemacie public i postgres.
Dlaczego warto używać schematów?
Schematy są bardzo przydatne do organizowania obiektów bazy danych w logiczne grupy i unikania kolizji nazw. Poza tym, schematy są często używane, aby umożliwić różnym użytkownikom pracę z bazą danych bez wzajemnego zakłócania się. Typowym przykładem jest sytuacja, w której każdy użytkownik bazy danych pracuje na swoim własnym schemacie, nie przeszkadzając innym użytkownikom i unikając konfliktów.
Klasyczny sposób zarządzania schematami PostgreSQL
Wszystkie poniższe zapytania zostaną wykonane z poziomu powłoki PostgreSQL.
Tworzenie schematu
Gdy tworzysz nową bazę danych w Postgres, domyślnym schematem jest publiczny. Nowy schemat może zostać utworzony poprzez wykonanie poniższego zapytania:
Przed dodaniem do niego kilku tabel, wyjaśnię dwa ważne pojęcia: nazwy kwalifikowane i niewykwalifikowane.
-
Nazwa kwalifikowana to nazwa schematu i nazwa tabeli oddzielone kropką. Określa ona schemat, w którym chcemy utworzyć naszą tabelę:
.
xxxxxxxxxx
CREATE TABLE schema_name.table_name (...);
-
Nazwa bez zastrzeżeń składa się tylko z nazwy tabeli. Spowoduje to utworzenie tabeli w wybranej bazie danych, która domyślnie jest publiczna. Można to zmienić za pomocą search_path, ale szczegóły na ten temat podamy później. Przykładem niewykwalifikowanego nazewnictwa jest:
.
xxxxxxxxxx
Kolumny tabel zostaną zdefiniowane wewnątrz nawiasów z zapytań powyżej (…).
Aby utworzyć nową tabelę w naszym nowym schemacie, wykonamy:
.
xxxxxxxxxx
CREATE TABLE schema_1.persons (name text, age int);
Aby porzucić schemat, mamy dwie możliwości. Jeśli schemat jest pusty (nie zawiera żadnej tabeli, widoku, ani innych obiektów), możemy wykonać:
.
xxxxxxxxxx
Jeśli schemat zawiera obiekty bazy danych, wstawimy polecenie kaskadowe:
.
xxxxxxxxxx
DROP SCHEMA schema_1 CASCADE;
W PostgreSQL możliwe jest również utworzenie schematu będącego własnością innego użytkownika z:
xxxxxxxxxx
CREATE SCHEMA schema_name AUTHORIZATION username;
Ścieżka wyszukiwania
Podczas wykonywania polecenia o niewykwalifikowanej nazwie, Postgres podąża ścieżką wyszukiwania, aby określić, jakich schematów użyć. Domyślnie ścieżka wyszukiwania ustawiona jest na schemat publiczny. Aby go wyświetlić, wykonaj:
.
xxxxxxxxxx
Jeśli nic nie zostało zmienione w Twojej bazie danych, to zapytanie powinno przynieść następny wynik:
xxxxxxxxxx
search_path
--------------
"$user",public
Ścieżkę wyszukiwania można zmodyfikować tak, aby system automatycznie wybierał inny schemat w przypadku użycia niewykwalifikowanej nazwy. Pierwszy schemat na ścieżce wyszukiwania nazywany jest aktualnym schematem. Na przykład, ustawię schemat_1 jako aktualny schemat:
.
xxxxxxxxxx
SET search_path TO schema_1,public;
Kolejne zapytanie użyje niewykwalifikowanej nazwy do utworzenia tabeli. Spowoduje to automatyczne utworzenie jej w schema_1:
.
xxxxxxxxxx
CREATE TABLE address (city text, street text, number int);
Nowa Droga: Manage Without The Code!
Istnieje prostszy sposób na wykonanie wszystkich zadań związanych z zarządzaniem schematami, bez konieczności pisania jakiejkolwiek linii kodu. Używając DbSchema możesz wykonać wszystkie powyższe zapytania z intuicyjnego GUI za pomocą zaledwie kilku kliknięć. Nawiązanie połączenia z bazą danych zajmie tylko kilka sekund. Od początku możesz wybrać, na jakim schemacie chcesz pracować.
Wybrany schemat lub schematy zostaną odwzorowane przez DbSchema i pokazane w układzie.
Aby utworzyć nowy schemat wystarczy kliknąć prawym przyciskiem myszy na folderze schematów w lewym menu i wybrać Utwórz schemat.
Aby utworzyć nową tabelę w schemacie kliknij prawym przyciskiem myszy na układzie i wybierz Utwórz tabelę.
Schemat można usunąć klikając prawym przyciskiem myszy na jego nazwę z lewego menu.
Aby dodać kolejny schemat z bazy danych wybierz Odśwież z bazy danych.
Używając DbSchema, nie będziesz musiał używać składni show_path, ponieważ możesz tworzyć tabele bezpośrednio w layoucie. Układ można porównać do deski kreślarskiej, na której możesz dodawać tabele i je edytować. Każdy layout posiada jeden schemat z nim związany, więc jeśli znajdujesz się na layoucie schema_1, tabele zostaną automatycznie utworzone w tym layoucie.
Praca offline
DbSchema przechowuje lokalny obraz schematu w lokalnym pliku projektu. Oznacza to, że plik projektu może być otwarty bez połączenia z bazą danych (offline). W trybie offline możesz wykonać wszystkie czynności przedstawione powyżej i więcej, ale bez danych. Po ponownym podłączeniu do bazy danych można porównać plik projektu z bazą danych i wybrać, które akcje zachować lub porzucić.
To samo można zrobić między dwiema różnymi wersjami tego samego pliku projektu. Na przykład, jeśli pracujesz w zespole, może się zdarzyć, że istnieje wiele schematów (produkcja, testowanie, rozwój), z których każdy ma swój własny plik projektu. Jeśli zmiana pojawi się w wersji rozwojowej i chcesz ją zaimplementować w pozostałych dwóch schematach, możesz po prostu porównać i zsynchronizować oba pliki projektu.
Zakończenie
Zrozumienie powyższych pojęć pomoże Ci w łatwy sposób zarządzać schematami PostgreSQL. Użycie wizualnego projektanta, takiego jak DbSchema, jeszcze bardziej ułatwi Ci pracę, umożliwiając wykonanie wszystkiego wizualnie, bez konieczności pisania choćby jednej linijki kodu.