06. Klucze główne i obce
Autor:
Grzegorz Chuchra
Opublikowano:
4 stycznia 2006
Odsłon:
75 045
Klucze są podstawową koncepcją w teorii relacyjnych baz
danych. Zapewniają tabelom możliwość skorelowania ze sobą dwóch lub więcej
tabel. Nawigacja w relacyjnej bazie danych zależy od możliwości identyfikacji
określonego wiersza w tabeli za pomocą klucza głównego. Artykuł ten poświęcony
będzie poświęcony teorii kluczy głównych i obcych oraz zasadom ich działania.
Związek pomiędzy dwoma lub większą ilością tabel to asocjacja (w potocznym
bazodanowym języku znana również jako relacja). Asocjacja jest wyrażona za
pomocą wartości klucza głównego i kluczy obcych.
Klucz główny - Primary Key, to kolumna lub zbiór kolumn, które
w sposób unikalny definiują wiersz w danej tabeli. Klucz obcy jest kolumną lub
zbiorem kolumn, który jest kluczem głównym w innej tabeli. Można powiedzieć, że
klucz obcy jest kopią klucza głównego z innej tabeli. Asocjacja jest utworzona
pomiędzy tabelami poprzez zaznaczenie, iż wartość z jednej tabeli, w której
jest kluczem obcym, jest powiązana z wartością z innej tabeli, gdzie jest
kluczem głównym. Ważne jest to, iż wartość klucza obcego nie może istnieć bez
powiązania z kluczem głównym. Jeśli w tabeli pracowników mamy pole, które jest
kluczem głównym w tabeli z państwami, to nie możemy wpisać w nie wartości,
która nie istnieje w tabeli państw. Silnik bazy danych nie zezwoli, aby wstawić
wartość klucza obcego, który nie posiada odnośnika na klucz obcy.

Teraz, kiedy mamy na czym skupić naszą uwagę, możemy przejść
do opisywania krok po kroku poszczególnych struktur i technik pracy z kluczami.
Powiemy, co określa klucz główny, co za tym idzie - w jaki sposób odnaleźć pole,
które aplikuje do bycia kluczem. Aby utworzyć taki podstawowy model danych
możemy posłużyć się następującym algorytmem:
- identyfikacja pól, które mogłyby się stać kluczami głównymi
- sprawdzenie poprawności kluczy i związków pomiędzy tabelami
- przeniesienie kluczy głównych do innych tabel jako klucze obce.
Określenie kluczy głównych
Klucz główny musi unikalnie
identyfikować wiersz. Każdy wiersz w naszej tabeli musi mieć wartość która
unikalnie go identyfikuje.
Aby zakwalifikować dany atrybut jako klucz główny, musimy sprawdzić, czy
posiada następujące własności:
- musi posiadać wartość dla każdego z wierszy
- dla każdego z tych wierszy wartość musi być unikalna
- wartość ta nie może się zmienić, ani nie może zostać usunięta
podczas całego funkcjonowania wiersza w tabeli
Jeśli mielibyśmy tabelę z użytkownikami zarejestrowanymi w
portalu internetowym, kluczem głównym mógłby być login. Jest unikalny w ramach
całej tabeli, a po usunięciu logina użytkownik ulega usunięciu. Kluczem głównym
nie mogłoby być nazwisko, gdyż może być wiele osób, które nazywają się
Kowalski. A to łamie drugą zasadę, która mówi, iż wartość musi być unikalna.
W niektórych przypadkach możemy mieć kilku kandydatów do klucza głównego.
Rozważmy ponownie ten sam przypadek. Przypuśćmy, że mamy dodatkowe informacje o
użytkowniku: datę urodzenia, PESEL, email. Wiemy, że unikalne są dwie wartości:
PESEL i email. Zatem zarówno jedną i drugą możemy zaproponować na klucz główny
w tabeli User. Teraz od nas tylko zależy czy wybierzemy email czy
PESEL. Ja osobiście wybrałbym PESEL ponieważ wyszukiwanie w bazach po wartości
typu INT (czyli typu całkowitoliczbowego) jest znacznie szybsze, niż po
łańcuchu znaków. Jeśli jednak byłby to portal możliwością logowania, trzeba
wziąć pod uwagę, że zmuszenie użytkownika, aby przy logowaniu wpisywał PESEL jest
trudniejsze niż skłonienie go do wpasania adresu email.
Klucze złożone
Czasem pojedyncza wartość nie wystarczy na jednoznaczne
określenie wiersza.
Jeśli chcielibyśmy zapisać oceny z przedmiotów dla danego
studenta musielibyśmy zapisać następujące informacje: przedmiot, z którego
ocena została wystawiona, studenta któremu ją wystawiamy i samą ocenę. W tym
celu należało by stworzyć następującą tabelę.
|
LessonID |
StudentID |
Mark |
|
01 |
01 |
5 |
|
01 |
02 |
2 |
|
02 |
01 |
3 |
Przyporządkowujemy zajęciom o
kluczu głównym 01 i studentowi o kluczu głównym 01 ocenę pięć. Zaś temu samemu
studentowi tylko dla innego przedmiotu o kluczu głównym 02 już ocenę trzy. W
tym wypadku mamy złożony klucz główny. Ponieważ ani LessonID ani
też StudentID pojedynczo nie spełnia wymagań unikalności klucza
głównego, musimy zastosować klucz złożony. W tym wypadku kluczem będzie
powiązanie LessonID i StudentID. Pojedynczo żaden z
nich nie może spełnić tego zadania, ale w sumie unikalnie określają każdy
wiersz.
Sprawdzenie poprawności kluczy
Podstawowe
zasady zarządzania i identyfikacji kluczy głównych:
- każda tabela w bazie danych powinna posiadać klucz główny
unikalnie identyfikujący wiersz.
- klucz główny nie może być opcjonalny. Czyli nie może posiadać
wartości nieokreślonej.
- klucz główny nie może się powtarzać. Może być co najwyżej jedna
wartość atrybutu klucza głównego w danej tabeli.
Sprawdzenie poprawności kluczy
Klucze
obce są polami, które umożliwiają zachowanie związku pomiędzy identyfikatorem w
tabeli, a tabelą, z której wartość ta się wywodzi. Klucze obce umożliwiają
zarządzanie integralnością i spójnością danych. Każda asocjacja w bazie powinna
być opatrzona kluczem obcym.
W przykładzie ze złożonym kluczem głównym mieliśmy do czynienia z dwoma
kolumnami LessonID oraz StudentID. Jeśli
zobaczylibyśmy, jak to wygląda w szerszym kontekście, moglibyśmy wyciągnąć
bardzo ciekawy wniosek. LessonID i StudentID są
kluczami obcymi z tabel Lesson i Student. Ponieważ
za pomocą LessonID możemy pobrać informacje o tym, jakiej lekcji
dotyczy LessonID 01, zaś z tabeli Student możemy
wybrać informacje o osobie, do której StudentID jest
przyporządkowane.
To jest właśnie istota kluczy. Nie musimy przechowywać wartości pola, wystarczy
nam sam klucz. Za pomocą jego unikalnej wartości możemy bez problemu wyciągnąć
interesującą nas wartość.
Podsumowanie
Klucze główne i klucze obce są podstawą teorii relacyjnych baz
danych. Każda z tabel powinna mieć kolumnę lub kolumny, na które można nałożyć
klucz główny jednoznacznie określający każdy z wierszy. Każda tabela
wykorzystująca w jakiś sposób dane z innych tabel powinna być powiązana z nią
za pomocą klucza obcego
Komentarze
strasznie niechlujnie napisane... proponuje zrobić rewizję tekstu - dotyczycy całego kursu a nie tylko tego działu.
vandalizmo,
30 sierpnia 2006, 15:44
eee dobrze jest
stasio,
18 maja 2007, 13:54
masakra... do tej pory nie miałem pojęcia że o rzeczach prostych można pisać tak trudno.
bayliss,
18 czerwca 2007, 14:11
jak ktoś wie o co chodzi nic więcej się nie dowie, jak ktoś nie wie o co chodzi to też nic więcej się nie dowie. ;)
f,
19 czerwca 2007, 13:07
"masakra... do tej pory nie miałem pojęcia że o rzeczach prostych można pisać tak trudno"
eeee tam nie jest trudno napisane ... jak ktośnic nie wie to się dowie z tego artykułu moim zdaniem, a jak ktoś wie to sobie powtórzy raz jeszcze, albo nie będzie czytać i już
zosh,
25 lipca 2007, 17:20
krotko i na temat . tak 3mac :)
Rafal,
3 sierpnia 2007, 22:15
mnie osobiście się podoba ewentualnie można by dodać troche przykladów ale ogólnie ok
Tomek,
10 września 2007, 13:28
Tomek ma rację, trochę błędów redakcyjnych tekstu, ale na początek nauki jest ogólnie ok.
corleonis,
15 września 2007, 08:48
Proste świetnie napisane.
Brodi,
22 września 2007, 09:19
Dobrze napisane. Co prawda wiem o czym czytałem bo znam te sprawy, jednak uważam, że bardziej prosto już nie można tego wyjaśnić. Przydał by się przykład tego, że dwa klucze obce tworzą po złożeniu klucz w innej tabeli. Jest to co prawda zaznaczone, ale nie wyjaśnione.
Piotr,
23 września 2007, 18:38
Pesel to zły pomysł. Zawsze ktoś mógłby dodać do bazy pesel, który nie jest jego (czyli nie jest prawdziwy).
Krystian,
10 listopada 2007, 17:35
15 lat zajmuję sie profesjonalnie bazami ale takie CUŚ to czytam pierwszy raz. Wzbudziło to moją litość.
Franek,
17 stycznia 2008, 21:16
Ja od 5 lat co prawda, ale uważam mimo wszystko, że artykuł jest znośny i raczej poprawny. Co do:
"Pesel to zły pomysł. Zawsze ktoś mógłby dodać do bazy pesel, który nie jest jego (czyli nie jest prawdziwy)."
Nazwisko, adres, ilość rodzeństwa i dowolną inną wartość poza mailem też moża skłamać. Możesz mieć id jako pesel, a mail zwreyfikować przy rejestracji - kto powiedział, że klucz ma byc zgodny z rzeczywistością? równie dobrze możesz nadać ID które z rzeczywistością nie ma nic wpsólnego iwielu wypadkach jest to dobry wybór....
qadro,
11 marca 2008, 09:55
W rzadnym wypadku nie należy stosowac kluczy naturalnych jak pesel. Po pierwsze to nie jest on stały - czasami się zmienia i co wtedy. Najlepiej stosować klucze sztuczne.
jaro,
16 lipca 2008, 14:45
"aby wstawić
wartość klucza obcego, który nie posiada odnośnika na klucz obcy."
Chyba chodziło tutaj o "na klucz główny."
Pozdrawiam.
Marcin,
24 maja 2009, 00:50
błąd " Artykuł ten poświęcony
będzie poświęcony .."
D.,
29 stycznia 2010, 19:38
Autor w pewnym momencie pisze, że kluczem może być PESEL bo po liczbach całkowitych szybciej się wyszukuje niż po łańcuchu tylko że PESEL jest 11 cyfrowy więc jako INTEGER go nie zapiszemy...
MANIU,
10 kwietnia 2010, 17:35
Dziadowski nic tu nie ma....!!!!
dd,
2 lutego 2011, 16:27
Wdg. mnie caly kurs jest dostepnie napisany. jesli ktos potrzebuje bardziej rozszerzonych to odsylam do manuali a nie do kursow :).
mozig,
21 czerwca 2011, 05:51
Beznadziejny kurs. Dla osób początkująch pisane zbyt trudnym językiem. Zero przykładów które mogłyby zobrazować teorię oraz pokazać jak tworzyć owe klucze
matrix,
10 lipca 2011, 15:42
w ciele artykułów stosuje się zazwyczaj czcionkę szeryfową
gość,
16 kwietnia 2012, 17:32