Zmiana schematu bazy danych: narzędzia i dobre praktyki w SQLite
Baza danych
pracownicy.dbBaza danych przygotowana w systemie bazodanowym SQLite3 zapisana jest w pliku pracownicy.db, który pobieramy i zapisujemy w wybranym katalogu. Do zarządzania bazą użyjemy programu SQLiteStudio, ale można do tego celu użyć również wiersza poleceń bazy SQLite3.
Na początku poznajmy schemat bazy.
Po uruchomieniu programu SQLiteStudio wybierz polecenie Bazy danych | Dodaj bazę danych i wskaż położenie pliku pracownicy.db. Następnie połącz się z bazą, dwukrotnie klikając nazwę bazy w panelu Bazy danych.
Następnie kliknij dwa razy nazwę tabeli pracownicy, w zakładce Struktura zobaczysz nazwy i typy danych pól zawartych w tabeli. Po wybraniu zakładki Dane zobaczysz przechowywane w tabeli wartości. Jeżeli klikniesz zakładkę DDL, zobaczysz polecenie SQL, które zostało użyte do utworzenia danej tabeli.
Zmiana schematu bazy
Baza zawiera dane na temat pracowników pewnej firmy. W tabeli pracownicy zawarte są informacje osobowe. Łatwo zauważyć, że część informacji dotycząca nazw miast i kodów pocztowych powtarza się. Odwołując się do zasad normalizacjinormalizacji, warto utworzyć nową tabelę słownikową z danymi miast i połączyć ją relacją z tabelą pracownicy.
W przypadku danych w omawianej bazie kody pocztowe są takie same dla każdego miasta, dlatego umieścimy je razem z nazwami miast w jednej tabeli. Gdyby tak nie było lub też chcielibyśmy, żeby baza była przygotowana na przechowywanie danych zgodne z zasadami normalizacji, kody pocztowe należałoby zapisać w osobnej tabeli. Taka tabela musiała by również zawierać identyfikatory miast, do których przynależą kody pocztowe.
W programie SQLiteStudio przywołujemy okno edytora SQL, wybierając polecenie Narzędzia | Otwórz edytor SQL. Wpisujemy i wykonujemy pierwszą instrukcję:
W wyniku kwerendy powstanie tabela miasta. Pierwsze pole będzie kluczem głównym. W drugim zapiszemy nazwy, w trzecim kody pocztowe miast.
Do nowej tabeli dodamy dane pobrane z tabeli pracownicy, przy użyciu podzapytania SELECT. Będą to niepowtarzające się nazwy miast i ich kody pocztowe.
Przy używaniu powyższego polecenia należy pamiętać, że obie tabele muszą mieć tę samą strukturę, jeśli chodzi o typy wybieranych pól.
Kliknij dwukrotnie tabelę miasta, a następnie kartę Dane, żeby zobaczyć wprowadzone wartości. Następnie wykonaj kwerendę:
W tabeli pracownicy stworzymy nowe pole id_miasta, które posłuży do utworzenia relacji z tabelą miasta:
Używamy klauzuli ALTER, która pozwala na:
zmianę nazwy tabeli,
dodawanie, usuwanie lub zmienianie pól tabeli,
dodawanie i usuwanie ograniczeńograniczeń nakładanych na pola tabeli.
Zamiast powtarzających się nazw i kodów pocztowych miast w tabeli pracownicy chcemy w każdym rekordzie zapisać identyfikator miasta. Użyjemy klauzuli UPDATE służącej do zmiany wartości przechowywanych w polach (kolumnach) bazy danych.
Powyższy kod czytamy następująco: zaktualizuj tabelę pracownicy, zmień wartość w polu id_miasta na identyfikator miasta wybrany przez podzapytanie z tabeli miasta na podstawie dopasowania nazwy miasta z obu tabel. Zwróćmy uwagę, że zapytanie wykonuje się na wszystkich rekordach.
Ponieważ w tabeli pracownicy mamy już odniesienie do tabeli miasta, zbędne pola moglibyśmy usunąć, a na nowe pole id_miasta nałożyć ograniczenie:
Jednak system bazodanowy SQLite3 nie wspiera powyższych operacji. Zamiast tego musimy utworzyć nową tabelę z odpowiednimi polami i zaimportować do niej dane z poprzedniej tabeli.
Zaczynamy od wykonania po kolei podanych trzech zapytań:
Dokładne wyjaśnienie powyższych zapytań znajduje się w następnej sekcji Misja: Ćwicz i zwyciężaj.
Problem klucza obcego
Tabelę pracownicy utworzymy na nowo za pomocą poniższego kodu:
Zwróćmy uwagę na definicję klucza obcego, którego nie mogliśmy dodać wcześniej ze względu na brak tej opcji w bazach SQLite3. W nowej tabeli nie tworzymy również niepotrzebnych już pól kod i miasto.
Dane w nowej tabeli umieścimy za pomocą poniższej klauzuli:
W zapytaniu wybierającym nie możemy użyć selektora wszystkich pól, czyli znaku znaku „*”, musimy podać we właściwej kolejności nazwy kolumn, ponieważ nie chcemy kopiować danych dotyczących miast.
Tabelę tymczasową pracownicy_tmp możemy już usunąć:
Na koniec należy przywrócić kontrolę ograniczeń kluczy obcych i sprawdzić poprawność wykonanych operacji:

Słownik
normalizacja bazy danych – proces, którego celem jest usunięcie powtarzających się informacji z bazy danych
(ang. constraints) reguły definiujące i później wymuszające cechy wartości przechowywanych w danym polu
