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 IBMi Microsoft. IBMmoże mieć Software Developmentdział, a Microsoft może mieć Desktop Softwaredział. IBM może mieć Software Engineerklasyfikację, a Microsoft może mieć Software Developerklasyfikację. Teraz, ponieważ masz klucz zastępczy Departmenti Classificationfakt, że Software Developmentjest to IBMwydział i Desktop Softwarejest Microsoftwydział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 IBMpracownikiem w Software Developmentdziale, którego klasyfikacja Software DevelopertoMicrosoftKlasyfikacja! 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 Millsi Bill Gatessą 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 Companytabeli, która jest podstawowa i nie ma rodziców, a następnie utwórz identyfikujące relacje z tabelami Departmenti Classificationpotomnymi. DepartmentI Classificationstoły mają teraz pK Company Idoraz numer sekwencji lub Nazwa je rozróżnić. Następnie, relacje z Departmenti Classificationdo Workertakże stać identifying, a tym samym PK Workerstaje się Company Idplus Department Number(używam numer sekwencji w tym przykładzie), plus Classification Number. Rezultat jest tylko one Company Idw Workertabeli. To jest teraz niemożliwe do przypisaniaWorkerDo Departmentjednego Companyoraz do Classificationw innym Company.
Dlaczego to jest niemożliwe? Jest to niemożliwe, ponieważ schemat realizuje więzy integralności między Workeri Departmenta Classification. Jeśli zostanie podjęta próba wstawienia a Workerdla Departmentjednego Companyi Classificationdrugiego, 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 Workerdanej Companypotrzeby zostać przypisany Classificationi Departmenttego samego Company. Ale jeśli w prawdziwym świecie Microsoftistnieje dział o nazwie, Desktop Softwareale 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.