Nie sądzę, że masz problem z relacjami. Myślę, że zamiast tego problem polega na tym, że przy użyciu kluczy zastępczych (tj. ID) dla każdej tabeli wynikowa baza danych nie jest w stanie uniemożliwić wstawienia pracowników, których dział jest jednej firmy, podczas gdy klasyfikacja jest innej i odwrotnie. Dobrym sposobem na zrozumienie tego jest wizualizacja schematu za pomocą narzędzia ER Diagramming. Użyję Oracle Data Modeler narzędzie, które jest do pobrania za darmo.
Diagram ER
W tej chwili możesz mieć 2 firmy - powiedzmy IBM
i Microsoft
. IBM
może mieć Software Development
dział, a Microsoft może mieć Desktop Software
dział. IBM może mieć Software Engineer
klasyfikację, a Microsoft może mieć Software Developer
klasyfikację. Teraz, ponieważ masz klucz zastępczy Department
i Classification
fakt, że Software Development
jest to IBM
wydział i Desktop Software
jest Microsoft
wydziałem, zostaje utracony dla przyszłych relacji z dziećmi. Tak jest również w przypadku Classification
. Dlatego łatwo jest przypadkowo przypisać Harlan Mills
, kto jest IBM
pracownikiem w Software Development
dziale, którego klasyfikacja Software Developer
toMicrosoft
Klasyfikacja! Podobnie pracownik może otrzymać odpowiednią klasyfikację i niewłaściwy dział! Oto schemat przedstawiający pierwszy przykład:
1 ID reprezentuje IBM
, a 2 ID reprezentuje Microsoft
. Mam wyróżnione czerwonym scenariuszu gdzie Harlan Mills
i Bill Gates
są przypisane do niewłaściwych działów, które są wizualizowane przez Id 10 działu związanego z 200 klasyfikacji Id i odwrotnie.
Opcje rozwiązania
Więc jakie są opcje, aby zapobiec jego wystąpieniu? Istnieją dwie natychmiastowe opcje. Pierwszym jest uświadomienie sobie, że przy użyciu klucza zastępczego dla każdej tabeli istnieje ten problem i wprowadzenie dodatkowego programowania w celu sprawdzenia, czy nie występuje. Można to zrobić w aplikacji, ale jeśli wstawki i aktualizacje mogą wystąpić poza aplikacją, nadal mogą wystąpić niepoprawne skojarzenia. Lepszym rozwiązaniem byłoby utworzenie wyzwalacza uruchamianego przy wstawianiu i aktualizacji pracownika, aby mieć pewność, że przypisany dział należy do tej samej firmy co przypisana klasyfikacja, a jeśli nie, wstawienie lub aktualizacja ulegną awarii.
Drugą opcją jest nieużywanie kluczy zastępczych dla każdego stołu. Zamiast tego używaj kluczy zastępczych tylko dla Company
tabeli, która jest podstawowa i nie ma rodziców, a następnie utwórz identyfikujące relacje z tabelami Department
i Classification
potomnymi. Department
I Classification
stoły mają teraz pK Company Id
oraz numer sekwencji lub Nazwa je rozróżnić. Następnie, relacje z Department
i Classification
do Worker
także stać identifying
, a tym samym PK Worker
staje się Company Id
plus Department Number
(używam numer sekwencji w tym przykładzie), plus Classification Number
. Rezultat jest tylko one
Company Id
w Worker
tabeli. To jest teraz niemożliwe do przypisaniaWorker
Do Department
jednego Company
oraz do Classification
w innym Company
.
Dlaczego to jest niemożliwe? Jest to niemożliwe, ponieważ schemat realizuje więzy integralności między Worker
i Department
a Classification
. Jeśli zostanie podjęta próba wstawienia a Worker
dla Department
jednego Company
i Classification
drugiego, kombinacja, która nie istnieje w odpowiedniej tabeli nadrzędnej, spowoduje naruszenie integralności referencyjnej i wstawka nie będzie działać.
Oto zaktualizowany schemat realizacji drugiej opcji:
Preferowana opcja
Z tych dwóch opcji absolutnie wolę drugą - używając relacji identyfikujących i kluczy kaskadowych - z dwóch powodów. Po pierwsze, ta opcja pozwala osiągnąć pożądaną regułę bez dodatkowego programowania. Opracowanie wyzwalacza nie jest trywialne. Musi być kodowany, testowany i konserwowany. Zapewnienie optymalnej logiki wyzwalania, aby nie wpływać na wydajność, nie jest również trywialne. Książka Applied Mathematics for Database Professionals zawiera wiele szczegółów na temat złożoności takiego rozwiązania. Po drugie, reguły sugerują, że Departament i Klasyfikacja nie mogą istnieć poza kontekstem Company
, a więc schemat teraz dokładniej odzwierciedla rzeczywisty świat.
To świetne pytanie, ponieważ pokazuje dokładnie, dlaczego po prostu założenie, że każda tabela wymaga klucza zastępczego, jest złym pomysłem. Fabian Pascal ma świetny post na blogu na ten temat, pokazujący, że klucz zastępczy może być nie tylko złym pomysłem z punktu widzenia integralności danych, ale może również spowolnić niektóre wyszukiwaniana poziomie fizycznym właśnie dlatego, że wymagane są sprzężenia, które, gdyby klucze były odpowiednio kaskadowane, byłyby niepotrzebne. Innym interesującym tematem tego pytania jest to, że baza danych nie może zapewnić, że wszystkie wprowadzone do niej dane są dokładne w stosunku do realnego świata. Zamiast tego może jedynie zapewnić, że wprowadzone do niego dane są zgodne z zadeklarowanymi mu regułami. W tym przypadku możemy zrobić najlepszy możliwy za pomocą klucza kaskadowe podejście do zapewnienia DBMS może zachować dane zgodne w odniesieniu do reguły, że Worker
danej Company
potrzeby zostać przypisany Classification
i Department
tego samego Company
. Ale jeśli w prawdziwym świecie Microsoft
istnieje dział o nazwie, Desktop Software
ale użytkownik bazy danych twierdzi, że jest to działSoftware Development
DBMS nie może nic zrobić, tylko założyć, że otrzymał prawdziwy fakt.