If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Rozdzielanie danych do powiązanych tabel

Do tej pory pracowaliśmy z tylko jedną tabelą w tym samym czasie i sprawdzaliśmy jakie interesujące dane możemy z niej odczytać. Ale w rzeczywistości, bardzo często spotkasz się z sytuacją, gdzie dane są rozproszone po wielu tabelach "powiązanych" ze sobą w jakiś sposób.
Na przykład, wyobraźmy sobie, że mamy tablicę w której umieścimy informacje o ocenach uczniów i na wszelki wypadek umieścimy w niej adresy email, gdybyśmy potrzebowali poinformować rodziców o problemach w nauce ich pociech:
imie_uczniaemail_uczniatestocena
Piotruś Królikpeter@rabbit.comOdżywianie95
Alicja Wonderlandalice@wonderland.comOdżywianie92
Piotruś Królikpeter@rabbit.comChemia85
Alicja Wonderlandalice@wonderland.comChemia95
Możemy dodatkowo stworzyć drugą tablicę w której będziemy przechowywać informacje o książkach przeczytanych przez danego ucznia:
imie_uczniatytul_ksiazkiautor_ksiazki
Piotruś KrólikThe Tale of Mrs. Tiggy-WinkleBeatrix Potter
Piotruś KrólikJabberwockyLewis Carroll
Alicja WonderlandThe Hunting of the SnarkLewis Carroll
Alicja WonderlandJabberwockyLewis Carroll
Wypadałoby stworzyć tablicę ze szczegółowymi informacjami o uczniach:
idimie_ucznianazwisko_uczniaemail_uczniaphonedata_urodzenia
1PiotruśKrólikpeter@rabbit.com555-66662001-05-10
2AlicjaWonderlandalice@wonderland.com555-44442001-04-02
Co sądzisz o tych tablicach? Czy zmieniłbyś je w jakiś sposób?
Musisz zdać sobie sprawę z jednej rzeczy o tych tabelach: opisują dane powiązane ze sobą - opisują dane, które są połączone. Każda z tych tabel opisuje dane odnoszące się do konkretnego ucznia i wiele tabel replikuje te same dane. Gdy te same dane są replikowane pomiędzy wieloma tabelami, mogą wystąpić ciekawe skutki uboczne.
Na przykład, co się stanie, gdy adres email ucznia się zmieni? Które tabele musielibyśmy zmienić?
Musielibyśmy zmienić tabelę z informacjami o uczniu, ale mamy tą informację także w tabeli z ocenami, więc musielibyśmy znaleźć każdy wiersz i zmienić w nim adres email.
Preferuje się posiadanie jednej informacji w jednym miejscu, dzięki czemu mamy mniej miejsc do aktualizacji i minimalizujemy ryzyko posiadania niezgodnych danych w różnych miejscach. Jeśli to zrobimy, musimy upewnić się, że mamy sposób na powiązanie danych z wielu tabel. Przejdziemy do tego później.
Załóżmy, że chcemy usunąć adres email z tabeli z ocenami, ponieważ zdaliśmy sobie sprawę z tego, że mamy adres email w tabeli z informacjami o uczniu. Tak wyglądałaby efekt:
imie_uczniatestocena
Piotruś KrólikOdżywianie95
Alicja WonderlandOdżywianie92
Piotruś KrólikChemia85
Alicja WonderlandChemia95
Skąd mamy wiedzieć, który adres email należy do danego ucznia? Moglibyśmy znaleźć wiersz w tabeli z informacjami o uczniu szukając po imieniu. Co zrobić jeśli dwóch uczniów nazywa się tak samo? (Czy wiesz, że na Bali, każda osoba ma jedno z czterech imion?) Nie możemy polegać na imieniu i naprawdę nigdy nie powinniśmy polegać na czymś takim jak imię do jednoznacznego określenia czegokolwiek w tabeli.
Najlepszą rzeczą jaką możemy zrobić będzie zastąpienie imie_ucznia kolumną id_ucznia, ponieważ jest to jednoznaczny identyfikator:
id_uczniatestocena
1Odżywianie95
2Odżywianie92
1Chemia85
2Chemia95
Powinniśmy wprowadzić tę samą zmianę do naszej tabeli z książkami, korzystając z kolumny student_id zamiast student_name:
id_uczniatytul_ksiazkiautor_ksiazki
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
1JabberwockyLewis Carroll
2The Hunting of the SnarkLewis Carroll
2JabberwockyLewis Carroll
Zauważyłeś jak powtórzyliśmy tytuł i autora dla Jabberwocky? To kolejny znak ostrzegawczy informujący nas, że powinniśmy rozdzielić tą tabelę na mniejsze tabele powiązane ze sobą w taki sposób, aby nie trzeba było zmieniać tych samych informacji o książce w wielu miejscach.
Możemy stworzyć tablicę z samymi książkami:
idtytul_ksiazkiautor_ksiazki
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
2JabberwockyLewis Carroll
3The Hunting of the SnarkLewis Carroll
Wtedy nasza tablica student_books wygląda następująco:
id_uczniaid_ksiazki
11
12
23
22
Wiem, że ta tabela nie jest tak prosta do odczytania jak stara tabela, która miała wszystkie informacje w sobie. Musisz pamiętać, że tabele nie są zaprojektowane do czytania przez człowieka -- są zaprojektowane, aby były łatwe w utrzymaniu i jak najmniej wrażliwe na błędy. W wielu przypadkach najlepszym rozwiązaniem jest rozdzielenie informacji na wiele tabel połączonych ze sobą, dzięki czemu unikamy powtórzeń i niepotrzebnych aktualizacji.
Musisz zrozumieć jak SQL korzysta z danych rozdzielonych pomiędzy wiele połączonych tabel i łączy je ze sobą, gdy tego potrzebujesz. Łączymy dane za pomocą koncepcji "join" i nauczysz się z niej korzystać w następnej części.

Chcesz dołączyć do dyskusji?

Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.