Database
 sql >> Baza danych >  >> RDS >> Database

Wzorzec relacji partyjnej. Jak modelować relacje

Relacje są wszędzie:między ludźmi, między organizacjami, między organizacjami i ludźmi. Pomyśl o byciu pracownikiem firmy, byciu członkiem zespołu projektowego lub byciu filią innej firmy. Czy istnieje prosty sposób na dokładne modelowanie i zarządzanie wszystkimi tymi relacjami? Czy możemy łatwo odpowiedzieć na pytanie „Kto wie kto?”

Szybki przegląd relacji

Dokładnie sposób, w jaki powstał ten podstawowy model, został opisany w moim poprzednim artykule, Elastyczne i łatwe w zarządzaniu projekty zestawień materiałowych (BOM).




W tym modelu i w konwencjonalnym projekcie BOM, 1st interactor wydaje się być lepszą Party w Relationship – pracodawca zamiast pracownika, lider zespołu zamiast członka zespołu itp.

Oto, jak mogą wyglądać dane (z rolą każdej ze stron w nawiasach):


1 interaktor 2 interaktorów
Widget Co. Inc. (pracodawca) Menedżer 1 (pracownik)
Widget Co. Inc. (pracodawca) Menedżer 2 (pracownik)
Widget Co. Inc. (pracodawca) Pracownik 1 (pracownik)
Widget Co. Inc. (pracodawca) Pracownik 2 (pracownik)
Widget Co. Inc. (pracodawca) Pracownik 3 (pracownik)
Widget Co. Inc. (pracodawca) Pracownik 4 (pracownik)
Menedżer 1 (odpowiedzialny za) Pracownik 1 (podlega)
Menedżer 1 (odpowiedzialny za) Pracownik 2 (podlega)
Menedżer 2 (odpowiedzialny za) Pracownik 3 (podlega)
Menedżer 2 (odpowiedzialny za) Pracownik 4 (podlega)


Bardziej wyrafinowany model

Wyobraź sobie, że chcesz zamodelować zespół projektowy w następujący sposób:

Źródło:https://www.edrawsoft.com/template-matrix -org-chart.php

Większość ról w tej hierarchii zespołu jest realna – m.in. analityk wymagań podlega analitykowi systemu. Innym sposobem patrzenia na to jest to, że analityk systemowy zarządza analitykiem wymagań.

Relacje między rolami można czytać od lewej do prawej (LTR) lub od prawej do lewej (RTL). Zwykle najlepiej jest trzymać się jednej lub drugiej konwencji – LTR lub RTL – ale w praktyce może się okazać, że są od tego wyjątki.

Zauważ też, że ten diagram pokazuje różne sposoby grupowania ról. Niektóre role są prawdziwe, jak mówiliśmy; inne są logiczne – np. grupa techniczna, grupa szkoleniowa, główny zespół i zespół wsparcia.

Można powiedzieć, że ten diagram definiuje strukturę zespołu z wykorzystaniem ról wymaganych do skompletowania zespołu deweloperskiego projektu. Różni się to od rzeczywistej instancji zespołu, która składałaby się z nazwisk prawdziwych osób w odniesieniu do każdej z ról.

Potrzebujemy więc modelu danych, który jest elastyczny i konfigurowalny , taki jak ten:




Żółte tabele zawierają metadane , a niebieskie tabele zawierają biznesowe bazy danych .

Ustawianie metadanych podstawy

Zaczniemy od wypełnienia party_type stół. Ta tabela rozróżnia, czy impreza jest osobą, czy organizacją.

Zanim zrobimy wiele więcej, musimy również zdefiniować role w role_type tabela metadanych:


Ładne imię Typ imprezy
HM Revenue and Customs (HMRC) Organizacja
Internal Revenue Service (IRS) Organizacja
Usługa paszportowa Organizacja
To samo Organizacja
Spółka z ograniczoną odpowiedzialnością Organizacja
Publiczna spółka z ograniczoną odpowiedzialnością Organizacja
Wnioskodawca Osoba
Ja Osoba
Inżynieria CTO Osoba
Kierownik projektu Osoba
Specjalista ds. projektów Osoba
Analityk systemu Osoba
Analityk wymagań Osoba
Pracownik techniczny Osoba
Administrator systemu Osoba
Starszy inżynier sprzętu Osoba
Inżynier sprzętu Osoba
Starszy inżynier oprogramowania Osoba
Inżynier oprogramowania Osoba
Inżynier baz danych Osoba
Pomoc techniczna Osoba
Menedżer kontroli jakości Osoba
Projektant stron internetowych Osoba
Inżynier ds. kontroli jakości oprogramowania Osoba
Biuro projektu Osoba
Inżynier bezpieczeństwa informacji Osoba
Techniczne Organizacja
Szkolenie Organizacja
Zespół główny Organizacja
Zespół wsparcia Organizacja


Bez wątpienia zauważyłeś, że każda rola należy do osoby lub organizacji. Aby dać wyobrażenie o tym, co jest możliwe, dodałem kilka zewnętrznych organizacji, z którymi współpracuje nasza fikcyjna spółka z ograniczoną odpowiedzialnością, ABC Software Inc.

Dodawanie metadanych zatrudnienia

Następnym zadaniem jest zdefiniowanie prawidłowych par ról między pierwszym a drugim interaktorem. To z kolei określa rodzaje relacji, jakie mogą mieć strony. Zacznijmy wypełniać role_type_relationship tabela metadanych z rolami pracowników firmy. W końcu nie możemy tworzyć zespołów bez uprzednich pracowników:


Typ pierwszej roli Drugi typ roli Kierunek opisu Opis Rodzaj relacji
Spółka z ograniczoną odpowiedzialnością Inżynieria CTO LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Kierownik projektu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Specjalista ds. projektów LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Analityk systemu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Analityk wymagań LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Pracownik techniczny LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Administrator systemu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Starszy inżynier sprzętu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Inżynier sprzętu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Starszy inżynier oprogramowania LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Inżynier oprogramowania LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Inżynier baz danych LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Pomoc techniczna LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Menedżer kontroli jakości LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Projektant stron internetowych LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Inżynier ds. kontroli jakości oprogramowania LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Biuro projektu LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Inżynier bezpieczeństwa informacji LTR zatrudnia PRAWDZIWE
Spółka z ograniczoną odpowiedzialnością Wnioskodawca LTR wybiera PRAWDZIWE


Załóżmy, że ABC Software Inc. zatrudni dwóch pracowników, Jane Smith i Alex Jones, na następujące stanowiska:


Relacje ze stronami Zależność typu roli
Pierwszy partner (organizacja) Drugi interaktor (osoba) Pierwszy uczestnik interakcji (rola) Drugi interaktor (rola) Opis
ABC Software Inc. Jana Smith Spółka z ograniczoną odpowiedzialnością Inżynieria CTO zatrudnia
ABC Software Inc. Alex Jones Spółka z ograniczoną odpowiedzialnością Kierownik projektu zatrudnia


Cofając się w czasie, zobaczysz, że ten związek zaczął się przed zatrudnieniem Jane Smith i Alexa Jonesa; musieli ubiegać się o pracę w ABC Software Inc. Relacja wyglądałaby tak:


Relacje ze stronami Zależność typu roli
Pierwszy partner (organizacja) Drugi interaktor (osoba) Pierwszy uczestnik interakcji (rola) Drugi interaktor (rola) Opis
ABC Software Inc. Jana Smith Spółka z ograniczoną odpowiedzialnością Wnioskodawca wybiera
ABC Software Inc. Alex Jones Spółka z ograniczoną odpowiedzialnością Wnioskodawca wybiera


Czy zaczynasz dostrzegać możliwości, jakie wzorzec relacji między stronami? obsługuje?

Nie mamy tabeli o nazwie applicant i kolejna tabela o nazwie employee , jakie można znaleźć w innych modelach. Jeśli się nad tym zastanowić, będą miały wiele takich samych atrybutów – imię i nazwisko, adres, data urodzenia itp.; musiałbyś skopiować wartości od applicant do employee po pomyślnym zatrudnieniu. Ale czy zaangażowani ludzie zostali przemienieni z jednej rzeczy w drugą? Oczywiście nie! To wciąż ci sami ludzie!

W rzeczywistości tylko relacja uległa zmianie pomiędzy ABC Software Inc. a Jane Smith lub Alexem Jonesem. I to jest dokładnie to, co modeluje wzorce relacji partyjnych.

Kontynuacja:Metadane zespołu projektowego

Zanim będziemy mogli utworzyć party_relationship tabeli, aby określić, że Jane Smith zarządza Alexem Jonesem, musimy zdefiniować strukturę zespołu deweloperskiego projektu. To tylko kwestia parowania ról rodzica i dziecka w celu utworzenia prawidłowej hierarchii:


Typ pierwszej roli Drugi typ roli Kierunek opisu Opis Rodzaj relacji
Zespół rozwoju projektu Inżynieria CTO RTL potencjalni klienci PRAWDZIWE
Inżynieria CTO Kierownik projektu LTR zarządza PRAWDZIWE
Kierownik projektu Analityk systemu LTR zarządza PRAWDZIWE
Kierownik projektu Administrator systemu LTR zarządza PRAWDZIWE
Kierownik projektu Specjalista ds. projektów LTR zarządza PRAWDZIWE
Kierownik projektu Starszy inżynier oprogramowania LTR zarządza PRAWDZIWE
Kierownik projektu Pomoc techniczna LTR zarządza PRAWDZIWE
Kierownik projektu Projektant stron internetowych LTR zarządza PRAWDZIWE
Kierownik projektu Inżynier ds. kontroli jakości oprogramowania LTR zarządza PRAWDZIWE
Kierownik projektu Biuro projektu LTR zarządza PRAWDZIWE
Kierownik projektu Inżynier bezpieczeństwa informacji LTR zarządza PRAWDZIWE
Kierownik projektu Inżynier baz danych LTR zarządza PRAWDZIWE
Kierownik projektu Pomoc techniczna LTR zarządza PRAWDZIWE
Kierownik projektu Menedżer kontroli jakości LTR zarządza PRAWDZIWE
Analityk systemu Analityk wymagań LTR zarządza PRAWDZIWE
Analityk wymagań Pracownik techniczny LTR zarządza PRAWDZIWE
Administrator systemu Starszy inżynier sprzętu LTR zarządza PRAWDZIWE
Starszy inżynier sprzętu Inżynier sprzętu LTR zarządza PRAWDZIWE
Starszy inżynier oprogramowania Inżynier oprogramowania LTR zarządza PRAWDZIWE


Dla wszystkich powyższych ról relacja jest odczytywana od lewej do prawej – np. kierownik projektu zarządza inżynierem bazy danych. Alternatywnie możesz przyjąć format od prawej do lewej (inżynier bazy danych zgłasza się do kierownika projektu), jeśli jest to preferowana konwencja.

Na koniec musimy zdefiniować relacje między naszymi dwoma nowymi pracownikami:


Relacje ze stronami Zależność typu roli
Pierwszy partner (organizacja) Drugi interaktor (osoba) Pierwszy uczestnik interakcji (rola) Drugi interaktor (rola) Opis
Jana Kowalski Alex Jones Inżynieria CTO Kierownik projektu zarządza


Oczywiście możesz mieć dowolną liczbę zespołów w kształcie tej hierarchii. W pewnym sensie zatem party_relationship jest instancją role_type_relationship . Jest to podobne do sposobu, w jaki obiekt jest instancją klasy w programowaniu obiektowym.

W tym metadane logiczne

W odniesieniu do diagramu zespołu deweloperskiego projektu możemy również zdefiniować następujące logiczne relacje między rolami :


Typ pierwszej roli Drugi typ roli Kierunek opisu Opis Rodzaj relacji
Zespół główny Specjalista ds. projektów RTL jest członkiem LOGICZNE
Zespół główny Analityk systemu RTL jest członkiem LOGICZNE
Zespół główny Analityk wymagań RTL jest członkiem LOGICZNE
Zespół główny Pracownik techniczny RTL jest członkiem LOGICZNE
Zespół główny Administrator systemu RTL jest członkiem LOGICZNE
Zespół główny Starszy inżynier sprzętu RTL jest członkiem LOGICZNE
Zespół główny Inżynier sprzętu RTL jest członkiem LOGICZNE
Zespół główny Starszy inżynier oprogramowania RTL jest członkiem LOGICZNE
Zespół główny Inżynier oprogramowania RTL jest członkiem LOGICZNE
Zespół główny Inżynier baz danych RTL jest członkiem LOGICZNE
Zespół główny Pomoc techniczna RTL jest członkiem LOGICZNE
Zespół główny Menedżer kontroli jakości RTL jest członkiem LOGICZNE
Zespół główny Projektant stron internetowych RTL jest członkiem LOGICZNE
Zespół główny Inżynier ds. kontroli jakości oprogramowania RTL jest członkiem LOGICZNE
Zespół główny Biuro projektu RTL jest członkiem LOGICZNE
Zespół główny Inżynier bezpieczeństwa informacji RTL jest członkiem LOGICZNE
Zespół wsparcia Projektant stron internetowych RTL jest członkiem LOGICZNE
Zespół wsparcia Inżynier ds. kontroli jakości oprogramowania RTL jest członkiem LOGICZNE
Zespół wsparcia Biuro projektu RTL jest członkiem LOGICZNE
Zespół wsparcia Inżynier bezpieczeństwa informacji RTL jest członkiem LOGICZNE


Pamiętaj, że party_relationship nigdy nie jest instancją logicznej role_type_relationship . Jaki jest więc sens definiowania relacji logicznych?

Cóż, najlepiej to wyjaśnić na przykładzie. Wyobraź sobie, że chcesz wysłać list do wszystkich pracowników, którzy logicznie są członkami zespołu wsparcia. Aby utworzyć listę mailingową, napisz zapytanie, które zwróci wszystkie role interaktora LOGICAL Support Team 2 połączone z tymi samymi rolami interaktora REAL 2, połączone z party_relationship , dołączył do 2 interakcji party . Umożliwiłoby to uzyskanie nazwisk i adresów wszystkich zainteresowanych.

Specjalny przypadek

Być może zauważyłeś kilka nietypowych wpisów w role_type tabela metadanych, a mianowicie:


Typ roli Typ imprezy
Ja Osoba
Taki sam Organizacja


Oto dwa przypadki szczególnego przypadku, który ma miejsce, gdy strona ma ze sobą refleksyjną relację:


Typ pierwszej roli Drugi typ roli Kierunek opisu Opis Rodzaj relacji
Ja Analityk systemu LTR zatrudniony PRAWDZIWE


Na przykład dla samozatrudnionego analityka systemu, interaktory 1 i 2 w party_relationship wróć do tej samej party wiersz – tzn. obie kolumny kluczy obcych zawierają dokładnie ten sam party.ID wartość.

Znaczenie posiadania kontekstu

Wyobraź sobie, że mamy mały zespół analityków, który zasadniczo składa się z gałęzi między kierownikiem projektu a pracownikiem technicznym:


Typ pierwszej roli Drugi typ roli Kierunek opisu Opis Rodzaj relacji
Mały zespół analityczny Kierownik projektu RTL potencjalni klienci PRAWDZIWE
Kierownik projektu Analityk systemu LTR zarządza PRAWDZIWE
Analityk systemu Analityk wymagań LTR zarządza PRAWDZIWE
Analityk wymagań Pracownik techniczny LTR zarządza PRAWDZIWE


Każda z relacji istnieje tutaj również w strukturze zespołu ds. rozwoju projektu. Jak więc odróżnić jednego kierownika projektu → analityka systemu od innego?

Używamy kontekstu opcjonalnego klucz obcy między role_type_relationship i role_type . Dla małego zespołu analitycznego ustawiamy kontekst wszystkich relacji na „mały zespół analityczny”, element najwyższego poziomu. I robimy to samo w przypadku struktury zespołu projektowego. Kiedy przemierzamy strukturę, robimy to tylko dla typu zespołu, który nas interesuje.

Wzorzec BOM relacji ze stronami Plusy i minusy

Jeśli czytałeś moje inne artykuły na ten temat, prawdopodobnie zgadłeś, że jestem fanem wzorca projektowego Bill of Materials. Jest prosty, ale bardzo potężny. Zastrzeżeniem jest to, że musi być odpowiednio używany i musi być dostosowany, aby Twoja implementacja była możliwa do zarządzania.

W tej implementacji wzorca BOM relacji między stronami zapewniamy, że nasze relacje pozostają dokładne, najpierw określając dopuszczalne relacje między interaktorami istniejącymi w naszej domenie. Uniemożliwiłoby to na przykład „zatrudnieniu” Internal Revenue Service jako projektanta stron internetowych w ABC Software Inc.

Jakie możliwości wynikają z definiowania relacji w ten sposób? Cóż, Twoja organizacja może potrzebować wiedzieć, dla jakich innych organizacji pracowali Twoi obecni pracownicy i kontrahenci. Pomaga to uniknąć możliwych konfliktów interesów, a nawet oszustw. Przykładem tego jest organizacja nagradzająca. Musi wiedzieć, w jakich szkołach wcześniej uczyli jej asesorzy, aby upewnić się, że nie oceniają prac egzaminacyjnych z tych szkół. W modelu relacji ze stronami łatwo jest wyszukiwać i uzyskiwać te informacje.

Z drugiej strony Twoja organizacja może chcieć przechowywać te same informacje, ponieważ może to przedstawiać możliwości biznesowe. Zależy to tylko od Twojej domeny.

Krótko mówiąc, spostrzeżenia, które można uzyskać z dobrze ustrukturyzowanych danych o relacjach między stronami, mogą być bezcenne.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Patrząc na wydajność migawki bazy danych

  2. Jak znaleźć minimalną wartość kolumny w SQL?

  3. Burzyć ściany! Jak usunąć silosowanie danych

  4. Czym jest SQL i jak zacząć z nim korzystać?

  5. Porównanie typowych wzorców infrastruktury baz danych