sql >> Databasteknik >  >> RDS >> Database

Partiförhållandemönster. Hur man modellerar relationer

Relationer finns överallt:mellan människor, mellan organisationer, mellan organisationer och människor. Tänk på att vara anställd i ett företag, vara medlem i ett projektteam eller vara ett dotterbolag till ett annat företag. Finns det ett enkelt sätt att noggrant modellera och hantera alla dessa relationer? Kan vi enkelt svara på frågan 'Vem vet vem?'

En snabb genomgång av relationer

Exakt hur denna grundmodell härleddes beskrevs i min tidigare artikel, Flexibla och hanterbara stycklistor (BOM) Designs.




I den här modellen och i konventionell stycklista är 1st interactor tenderar att vara den överlägsna Party i Relationship – arbetsgivare snarare än anställd, teamledare snarare än teammedlem, etc.

Så här kan uppgifterna se ut (med den roll varje part spelar inom parentes):


1 interaktör 2 interaktörer
Widget Co. Inc. (arbetsgivare) Manager 1 (anställd)
Widget Co. Inc. (arbetsgivare) Manager 2 (anställd)
Widget Co. Inc. (arbetsgivare) Anställd 1 (anställd)
Widget Co. Inc. (arbetsgivare) Anställd 2 (anställd)
Widget Co. Inc. (arbetsgivare) Anställd 3 (anställd)
Widget Co. Inc. (arbetsgivare) Anställd 4 (anställd)
Manager 1 (ansvarig för) Anställd 1 (rapporterar till)
Manager 1 (ansvarig för) Anställd 2 (rapporterar till)
Manager 2 (ansvarig för) Anställd 3 (rapporterar till)
Manager 2 (ansvarig för) Anställd 4 (rapporterar till)


En mer sofistikerad modell

Föreställ dig att du vill modellera ett projektutvecklingsteam enligt följande:

Källa:https://www.edrawsoft.com/template-matrix -org-chart.php

De flesta av rollerna i denna laghierarki är verkliga – t.ex. kravanalytikern rapporterar till systemanalytikern. Ett annat sätt att se på det är att systemanalytikern sköter kravanalytikern.

Relationer mellan roller kan läsas från vänster till höger (LTR) eller från höger till vänster (RTL). Det är normalt bäst att hålla sig till den ena eller den andra konventionen – LTR eller RTL – men i praktiken kan du upptäcka att det finns undantag från detta.

Lägg också märke till att det här diagrammet visar olika sätt att gruppera roller. Vissa roller är verkliga, som vi har diskuterat; andra är logiska – t.ex. den tekniska gruppen, träningsgruppen, kärnteamet och supportteamet.

Vi kan säga att detta diagram definierar teamstruktur använda de roller som krävs för att slutföra projektutvecklingsteamet. Detta skiljer sig från en faktisk instans av teamet, som skulle bestå av riktiga personers namn mot var och en av rollerna.

Så vi behöver en datamodell som är flexibel och konfigurerbar , som den här:




De gula tabellerna innehåller metadata , och de blå tabellerna innehåller företagsdata .

Ställa in grundmetadata

Vi börjar med att fylla i party_type tabell. Denna tabell skiljer på om ett parti är en person eller en organisation.

Innan vi gör mycket annat måste vi också definiera roller i role_type metadatatabell:


Pretty Name Partytyp
HM Revenue and Customs (HMRC) Organisation
Internal Revenue Service (IRS) Organisation
Passservice Organisation
Samma Organisation
Aktiebolag Organisation
Aktiebolag Organisation
Sökande Person
Själv Person
CTO Engineering Person
Projektledare Person
Projektspecialist Person
Systemanalytiker Person
Kravanalytiker Person
Teknisk kontorist Person
Systemadministratör Person
Senior hårdvaruingenjör Person
Hårdvaruingenjör Person
Senior mjukvaruingenjör Person
Programvaruingenjör Person
Databasingenjör Person
Teknisk support Person
QA Manager Person
Webbdesigner Person
Software QA Engineer Person
Projektkontor Person
Informationssäkerhetsingenjör Person
Teknisk Organisation
Träning Organisation
Kärnteam Organisation
Supportteam Organisation


Du har utan tvekan noterat att varje roll tillhör antingen en person eller en organisation. För att ge en uppfattning om vad som är möjligt har jag lagt till några externa organisationer som vårt fiktiva aktiebolag, ABC Software Inc, har relationer med.

Lägga till anställningsmetadata

Nästa uppgift är att definiera de giltiga rollparen mellan den första och andra interaktören. Detta definierar i sin tur vilka typer av relationer parterna kan ha. Låt oss börja fylla i role_type_relationship metadatatabell med företagets anställdas roller. När allt kommer omkring kan vi inte skapa team utan att först ha arbetare:


Första rolltypen Andra rolltyp Beskrivningsriktning Beskrivning Typ av relation
Begränsat företag CTO Engineering LTR anställer VERKLIG
Aktiebolag Projektledare LTR anställer VERKLIG
Aktiebolag Projektspecialist LTR anställer VERKLIG
Aktiebolag Systemanalytiker LTR anställer VERKLIG
Aktiebolag Kravanalytiker LTR anställer VERKLIG
Aktiebolag Teknisk kontorist LTR anställer VERKLIG
Aktiebolag Systemadministratör LTR anställer VERKLIG
Aktiebolag Senior hårdvaruingenjör LTR anställer VERKLIG
Aktiebolag Hårdvaruingenjör LTR anställer VERKLIG
Aktiebolag Senior Software Engineer LTR anställer VERKLIG
Aktiebolag Programvaruingenjör LTR anställer VERKLIG
Aktiebolag Databasingenjör LTR anställer VERKLIG
Aktiebolag Teknisk support LTR anställer VERKLIG
Aktiebolag QA Manager LTR anställer VERKLIG
Aktiebolag Webbdesigner LTR anställer VERKLIG
Aktiebolag Software QA Engineer LTR anställer VERKLIG
Aktiebolag Projektkontor LTR anställer VERKLIG
Aktiebolag Informationssäkerhetsingenjör LTR anställer VERKLIG
Aktiebolag Sökande LTR väljer VERKLIG


Anta att ABC Software Inc. kommer att anställa två anställda, Jane Smith och Alex Jones, för följande roller:


Festförhållande Rolltypsrelation
Första interaktör (organisation) Andra interaktör (person) Första interaktör (roll) Andra interaktör (roll) Beskrivning
ABC Software Inc. Jane Smith Aktiebolag CTO Engineering anställer
ABC Software Inc. Alex Jones Aktiebolag Projektledare anställer


Om du tar ett steg tillbaka i tiden skulle du se att detta förhållande började innan Jane Smith och Alex Jones anställdes; de var tvungna att söka jobb på ABC Software Inc. Relationen skulle ha sett ut så här:


Festförhållande Rolltypsrelation
Första interaktör (organisation) Andra interaktör (person) Första interaktör (roll) Andra interaktör (roll) Beskrivning
ABC Software Inc. Jane Smith Aktiebolag Sökande väljer
ABC Software Inc. Alex Jones Aktiebolag Sökande väljer


Börjar du se de möjligheter som partsrelationsmönstret stöder?

Vi har ingen tabell som heter applicant och en annan tabell som heter employee , som kan finnas i andra modeller. Om du tänker på det, skulle de dela många av samma attribut – namn, adress, födelsedatum, etc; du måste kopiera värdena från applicant till employee vid framgångsrik anställning. Men har de inblandade förvandlats från en sak till en annan? Självklart inte! De är fortfarande samma människor!

Faktum är att det är bara förhållandet som har förändrats mellan ABC Software Inc. och Jane Smith eller Alex Jones. Och det är precis vad partirelationsmönstret modellerar.

Fortsätter på:Project Team Metadata

Innan vi kan skapa en party_relationship tabell för att definiera det faktum att Jane Smith leder Alex Jones, måste vi definiera projektutvecklingsteamets struktur. Det här är bara en fråga om att para ihop överordnade och underordnade roller för att bilda en giltig hierarki:


Första rolltypen Andra rolltyp Beskrivningsriktning Beskrivning Typ av relation
Projektutvecklingsteam CTO Engineering RTL leads VERKLIG
CTO Engineering Projektledare LTR hanterar VERKLIG
Projektledare Systemanalytiker LTR hanterar VERKLIG
Projektledare Systemadministratör LTR hanterar VERKLIG
Projektledare Projektspecialist LTR hanterar VERKLIG
Projektledare Senior Software Engineer LTR hanterar VERKLIG
Projektledare Teknisk support LTR hanterar VERKLIG
Projektledare Webbdesigner LTR hanterar VERKLIG
Projektledare Software QA Engineer LTR hanterar VERKLIG
Projektledare Projektkontor LTR hanterar VERKLIG
Projektledare Informationssäkerhetsingenjör LTR hanterar VERKLIG
Projektledare Databasingenjör LTR hanterar VERKLIG
Projektledare Teknisk support LTR hanterar VERKLIG
Projektledare QA Manager LTR hanterar VERKLIG
Systemanalytiker Kravanalytiker LTR hanterar VERKLIG
Kravanalytiker Teknisk kontorist LTR hanterar VERKLIG
Systemadministratör Senior hårdvaruingenjör LTR hanterar VERKLIG
Senior hårdvaruingenjör Hårdvaruingenjör LTR hanterar VERKLIG
Senior mjukvaruingenjör Programvaruingenjör LTR hanterar VERKLIG


För alla ovanstående roller läses relationen från vänster till höger – t.ex. projektledaren leder databasingenjören. Alternativt kan du använda formatet från höger till vänster (databasingenjören rapporterar till projektledaren) om det är din föredragna konvention.

Slutligen måste vi definiera relationen mellan våra två nya medarbetare:


Festförhållande Rolltypsrelation
Första interaktör (organisation) Andra interaktör (person) Första interaktör (roll) Andra interaktör (roll) Beskrivning
Jane Smith Alex Jones CTO Engineering Projektledare hanterar


Naturligtvis kan du ha valfritt antal lag i form av denna hierarki. På sätt och vis, därför party_relationship är en instans av role_type_relationship . Detta liknar det sätt som ett objekt är en instans av en klass i OO-programmering.

Inklusive logisk metadata

Med hänvisning till diagrammet för projektutvecklingsteamet kan vi också definiera följande logiska relationer mellan roller :


Första rolltypen Andra rolltyp Beskrivningsriktning Beskrivning Typ av relation
Kärnteam Projektspecialist RTL är medlem av LOGISKT
Kärnteam Systemanalytiker RTL är medlem av LOGISKT
Kärnteam Kravanalytiker RTL är medlem av LOGISKT
Kärnteam Teknisk kontorist RTL är medlem av LOGISKT
Kärnteam Systemadministratör RTL är medlem av LOGISKT
Kärnteam Senior hårdvaruingenjör RTL är medlem av LOGISKT
Kärnteam Hårdvaruingenjör RTL är medlem av LOGISKT
Kärnteam Senior Software Engineer RTL är medlem av LOGISKT
Kärnteam Programvaruingenjör RTL är medlem av LOGISKT
Kärnteam Databasingenjör RTL är medlem av LOGISKT
Kärnteam Teknisk support RTL är medlem av LOGISKT
Kärnteam QA Manager RTL är medlem av LOGISKT
Kärnteam Webbdesigner RTL är medlem av LOGISKT
Kärnteam Software QA Engineer RTL är medlem av LOGISKT
Kärnteam Projektkontor RTL är medlem av LOGISKT
Kärnteam Informationssäkerhetsingenjör RTL är medlem av LOGISKT
Supportteam Webbdesigner RTL är medlem av LOGISKT
Supportteam Software QA Engineer RTL är medlem av LOGISKT
Supportteam Projektkontor RTL är medlem av LOGISKT
Supportteam Informationssäkerhetsingenjör RTL är medlem av LOGISKT


Observera att party_relationship är aldrig en instans av ett logiskt role_type_relationship . Så vad är poängen med att definiera logiska relationer?

Tja, detta förklaras nog bäst som ett exempel. Föreställ dig att du ville skicka ett brev till alla anställda som logiskt sett är medlemmar i supportteamet. För att skapa en e-postlista skulle du skriva en fråga som returnerar alla LOGICAL Support Team 2-interaktörsroller kopplade till samma REAL 2 interaktörsroller, kopplade till party_relationship , gick med i 2 interaktörs party . Detta skulle tillåta dig att få namn och adresser till alla berörda.

Ett specialfall

Du kanske har märkt ett par ovanliga poster i role_type metadatatabell, nämligen:


Rolltyp Partytyp
Själv Person
Samma Organisation


Det här är två fall av ett specialfall, som inträffar när en part har ett reflexivt förhållande till sig själv:


Första rolltypen Andra rolltyp Beskrivningsriktning Beskrivning Typ av relation
Själv Systemanalytiker LTR anställd VERKLIG


Till exempel, för en egenföretagare systemanalytiker, interaktörerna 1 och 2 i party_relationship hänvisa tillbaka till samma party rad – dvs båda kolumnerna för främmande nyckel innehåller exakt samma party.ID värde.

Vikten av att ha sammanhang

Föreställ dig att vi har ett litet analysteam som i grunden består av grenen mellan projektledaren och den tekniska tjänstemannen:


Första rolltypen Andra rolltyp Beskrivningsriktning Beskrivning Typ av relation
Små analysteam Projektledare RTL leads VERKLIG
Projektledare Systemanalytiker LTR hanterar VERKLIG
Systemanalytiker Kravanalytiker LTR hanterar VERKLIG
Kravanalytiker Teknisk kontorist LTR hanterar VERKLIG


Var och en av relationerna här finns också i strukturen för projektutvecklingsteamet. Så, hur skiljer vi en projektledare → systemanalytikerrelation från en annan?

Vi använder det valfria sammanhanget främmande nyckel mellan role_type_relationship och role_type . För det lilla analysteamet sätter vi sammanhanget för alla relationer till "litet analysteam", elementet på toppnivå. Och vi gör samma sak för strukturen för projektutvecklingsteamet. När vi korsar strukturen gör vi det bara för den typ av lag vi är intresserade av.

För- och nackdelar för partirelationer BOM-mönster

Om du har läst mina andra artiklar om ämnet, har du förmodligen gissat att jag är ett fan av Bill of Materials designmönster. Det är enkelt, men väldigt kraftfullt. Förbehållet är att det måste användas på rätt sätt och det måste skräddarsys så att din implementering förblir hanterbar.

I den här partrelationsimplementeringen av BOM-mönstret säkerställer vi att våra relationer förblir korrekta genom att först definiera de tillåtna relationerna mellan de interaktörer som finns i vår domän. Detta skulle till exempel hindra Internal Revenue Service från att "anställas" som webbdesigner på ABC Software Inc.

Vilka möjligheter uppstår genom att definiera relationer på detta sätt? Jo, din organisation kan behöva veta vilka andra organisationer dina nuvarande anställda och entreprenörer har arbetat för. Detta hjälper till att undvika eventuella intressekonflikter eller till och med bedrägerier. Ett exempel på detta är en utdelande organisation. Den måste veta vid vilka skolor dess bedömare tidigare har undervisat för att säkerställa att de inte bedömer tentamensuppgifter från dessa skolor. I en partsrelationsmodell är det lätt att fråga och få den informationen.

Å andra sidan kanske din organisation vill lagra samma information eftersom det kan ge affärsmöjligheter. Det beror bara på din domän.

Kort sagt, de insikter du kan få från välstrukturerade partrelationsdata kan vara ovärderliga.


  1. KGXGN polling fel (15)

  2. PostgreSQL-trender:Mest populära molnleverantörer, språk, VAKUUM, frågehanteringsstrategier och implementeringstyper i företag

  3. Använder ORDER BY och GROUP BY tillsammans

  4. Denormalisering:När, varför och hur