Database
 sql >> Database >  >> RDS >> Database

Modello di relazione di partito. Come modellare le relazioni

Le relazioni sono ovunque:tra persone, tra organizzazioni, tra organizzazioni e persone. Pensa all'essere un dipendente di un'azienda, essere un membro di un team di progetto o essere una filiale di un'altra azienda. Esiste un modo semplice per modellare e gestire accuratamente tutte queste relazioni? Possiamo facilmente rispondere alla domanda "Chissà chi?"

Una rapida rassegna delle relazioni

Il modo esatto in cui è stato derivato questo modello di base è stato descritto nel mio articolo precedente, Disegni di distinte base flessibili e gestibili.




In questo modello e nella progettazione BOM convenzionale, il 1st interactor tende ad essere il Party nel Relationship – datore di lavoro anziché dipendente, team leader anziché membro del team, ecc.

Ecco come potrebbero apparire i dati (con il ruolo svolto da ciascuna parte tra parentesi):


1 interagente 2 interlocutori
Widget Co. Inc. (datore di lavoro) Direttore 1 (dipendente)
Widget Co. Inc. (datore di lavoro) Direttore 2 (dipendente)
Widget Co. Inc. (datore di lavoro) Dipendente 1 (dipendente)
Widget Co. Inc. (datore di lavoro) Dipendente 2 (dipendente)
Widget Co. Inc. (datore di lavoro) Dipendente 3 (dipendente)
Widget Co. Inc. (datore di lavoro) Dipendente 4 (dipendente)
Manager 1 (responsabile di) Dipendente 1 (riferisce a)
Manager 1 (responsabile di) Dipendente 2 (riferisce a)
Manager 2 (responsabile di) Dipendente 3 (riferisce a)
Manager 2 (responsabile di) Dipendente 4 (riferisce a)


Un modello più sofisticato

Immagina di voler modellare un team di sviluppo del progetto come il seguente:

Fonte:https://www.edrawsoft.com/template-matrix -org-chart.php

La maggior parte dei ruoli in questa gerarchia del team sono reali, ad es. l'analista dei requisiti riporta all'analista di sistema. Un altro modo di vedere è che l'analista di sistema gestisce l'analista dei requisiti.

Le relazioni tra i ruoli possono essere lette da sinistra a destra (LTR) o da destra a sinistra (RTL). Normalmente è meglio attenersi a una convenzione o all'altra, LTR o RTL, ma in pratica potresti scoprire che esistono delle eccezioni.

Si noti inoltre che questo diagramma mostra diversi modi di raggruppare i ruoli. Alcuni ruoli sono reali, come abbiamo discusso; altri sono logici, ad es. il gruppo tecnico, il gruppo di formazione, il core team e il team di supporto.

Possiamo dire che questo diagramma definisce la struttura del team utilizzando i ruoli necessari per completare il team di sviluppo del progetto. Questo è distinto da un'istanza reale della squadra, che sarebbe composta da nomi di persone reali contro ciascuno dei ruoli.

Quindi abbiamo bisogno di un modello di dati che sia flessibile e configurabile , come questo:




Le tabelle gialle contengono metadati e le tabelle blu contengono dati aziendali .

Impostazione dei metadati di base

Inizieremo compilando il party_type tavolo. Questa tabella distingue se una parte è una persona o un'organizzazione.

Prima di fare molto altro, dobbiamo anche definire i ruoli nel role_type tabella dei metadati:


Bel nome Tipo di festa
HM Revenue and Customs (HMRC) Organizzazione
Internal Revenue Service (IRS) Organizzazione
Servizio passaporti Organizzazione
Lo stesso Organizzazione
Società a responsabilità limitata Organizzazione
Società per azioni Organizzazione
Richiedente Persona
Persona
Ingegneria CTO Persona
Responsabile del progetto Persona
Specialista di progetto Persona
Analista di sistema Persona
Analista dei requisiti Persona
Impiegato tecnico Persona
Amministratore di sistema Persona
Ingegnere hardware senior Persona
Ingegnere hardware Persona
Ingegnere software senior Persona
Ingegnere software Persona
Ingegnere di database Persona
Assistenza tecnica Persona
Responsabile QA Persona
Web Designer Persona
Ingegnere QA software Persona
Ufficio progetti Persona
Ingegnere della sicurezza delle informazioni Persona
Tecnico Organizzazione
Formazione Organizzazione
Team principale Organizzazione
Team di supporto Organizzazione


Hai senza dubbio notato che ogni ruolo appartiene a una persona o a un'organizzazione. Per dare un'idea di ciò che è possibile, ho aggiunto alcune organizzazioni esterne con cui la nostra società per azioni fittizia, ABC Software Inc, ha rapporti.

Aggiunta di metadati sull'occupazione

Il prossimo compito è definire le coppie di ruoli valide tra il primo e il secondo interlocutore. A sua volta, questo definisce i tipi di relazioni che le parti possono avere. Iniziamo a compilare il role_type_relationship tabella di metadati con i ruoli dei dipendenti dell'azienda. Dopotutto, non possiamo creare team senza prima avere lavoratori:


1° tipo di ruolo 2° tipo di ruolo Descrizione Direzione Descrizione Tipo di relazione
Società a responsabilità limitata Ingegneria CTO LTR impiega REALE
Società a responsabilità limitata Responsabile del progetto LTR impiega REALE
Società a responsabilità limitata Specialista di progetto LTR impiega REALE
Società a responsabilità limitata Analista di sistema LTR impiega REALE
Società a responsabilità limitata Analista dei requisiti LTR impiega REALE
Società a responsabilità limitata Impiegato tecnico LTR impiega REALE
Società a responsabilità limitata Amministratore di sistema LTR impiega REALE
Società a responsabilità limitata Ingegnere hardware senior LTR impiega REALE
Società a responsabilità limitata Ingegnere hardware LTR impiega REALE
Società a responsabilità limitata Ingegnere software senior LTR impiega REALE
Società a responsabilità limitata Ingegnere software LTR impiega REALE
Società a responsabilità limitata Ingegnere di database LTR impiega REALE
Società a responsabilità limitata Assistenza tecnica LTR impiega REALE
Società a responsabilità limitata Responsabile QA LTR impiega REALE
Società a responsabilità limitata Web Designer LTR impiega REALE
Società a responsabilità limitata Ingegnere QA software LTR impiega REALE
Società a responsabilità limitata Ufficio progetti LTR impiega REALE
Società a responsabilità limitata Ingegnere della sicurezza delle informazioni LTR impiega REALE
Società a responsabilità limitata Richiedente LTR seleziona REALE


Supponiamo che ABC Software Inc. assumerà due dipendenti, Jane Smith e Alex Jones, per i seguenti ruoli:


Rapporto tra le parti Relazione tipo ruolo
1° Interactor (Organizzazione) 2° Interattore (Persona) 1° Interactor (ruolo) 2° Interattore (ruolo) Descrizione
ABC Software Inc. Jane Smith Società a responsabilità limitata Ingegneria CTO impiega
ABC Software Inc. Alex Jones Società a responsabilità limitata Responsabile del progetto impiega


Facendo un passo indietro nel tempo, vedresti che questa relazione è iniziata prima che Jane Smith e Alex Jones fossero assunti; hanno dovuto fare domanda per un lavoro presso ABC Software Inc. La relazione sarebbe stata simile a questa:


Rapporto tra le parti Relazione tipo ruolo
1° Interactor (Organizzazione) 2° Interattore (Persona) 1° Interactor (ruolo) 2° Interattore (ruolo) Descrizione
ABC Software Inc. Jane Smith Società a responsabilità limitata Richiedente seleziona
ABC Software Inc. Alex Jones Società a responsabilità limitata Richiedente seleziona


Stai iniziando a vedere le possibilità che il modello di relazione tra le parti supporta?

Non abbiamo una tabella chiamata applicant e un'altra tabella chiamata employee , come si può trovare in altri modelli. Se ci pensi, condividerebbero molti degli stessi attributi:nome, indirizzo, data di nascita, ecc; dovresti copiare i valori da applicant a employee dopo l'assunzione di successo. Ma le persone coinvolte sono state trasformate da una cosa in un'altra? Ovviamente no! Sono sempre le stesse persone!

In realtà, è solo il rapporto che è cambiato tra ABC Software Inc. e Jane Smith o Alex Jones. E questo è esattamente ciò che modella il modello di relazione di partito.

Continuare:Metadati del team di progetto

Prima di poter creare una party_relationship tabella per definire il fatto che Jane Smith gestisce Alex Jones, dobbiamo definire la struttura del team di sviluppo del progetto. Questa è solo una questione di abbinamento dei ruoli genitore e figlio per formare una gerarchia valida:


1° tipo di ruolo 2° tipo di ruolo Descrizione Direzione Descrizione Tipo di relazione
Team di sviluppo del progetto Ingegneria CTO RTL responsabili REALE
Ingegneria CTO Responsabile del progetto LTR gestisce REALE
Responsabile del progetto Analista di sistema LTR gestisce REALE
Responsabile del progetto Amministratore di sistema LTR gestisce REALE
Responsabile del progetto Specialista di progetto LTR gestisce REALE
Responsabile del progetto Ingegnere software senior LTR gestisce REALE
Responsabile del progetto Assistenza tecnica LTR gestisce REALE
Responsabile del progetto Web Designer LTR gestisce REALE
Responsabile del progetto Ingegnere QA software LTR gestisce REALE
Responsabile del progetto Ufficio progetti LTR gestisce REALE
Responsabile del progetto Ingegnere della sicurezza delle informazioni LTR gestisce REALE
Responsabile del progetto Ingegnere di database LTR gestisce REALE
Responsabile del progetto Assistenza tecnica LTR gestisce REALE
Responsabile del progetto Responsabile QA LTR gestisce REALE
Analista di sistema Analista dei requisiti LTR gestisce REALE
Analista dei requisiti Impiegato tecnico LTR gestisce REALE
Amministratore di sistema Ingegnere hardware senior LTR gestisce REALE
Ingegnere hardware senior Ingegnere hardware LTR gestisce REALE
Ingegnere software senior Ingegnere software LTR gestisce REALE


Per tutti i ruoli di cui sopra, la relazione viene letta da sinistra a destra, ad es. il project manager gestisce il database engineer. In alternativa, puoi adottare il formato da destra a sinistra (l'ingegnere del database riporta al project manager) se questa è la tua convenzione preferita.

Infine, dobbiamo definire il rapporto tra i nostri due nuovi dipendenti:


Rapporto tra le parti Relazione tipo ruolo
1° Interactor (Organizzazione) 2° Interattore (Persona) 1° Interactor (ruolo) 2° Interattore (ruolo) Descrizione
Jane Smith Alex Jones Ingegneria CTO Responsabile del progetto gestisce


Ovviamente puoi avere un numero qualsiasi di squadre nella forma di questa gerarchia. In un certo senso, quindi, party_relationship è un'istanza di role_type_relationship . Questo è simile al modo in cui un oggetto è un'istanza di una classe nella programmazione OO.

Compresi i metadati logici

Con riferimento al diagramma del team di sviluppo del progetto, possiamo anche definire le seguenti relazioni logiche tra ruoli :


1° tipo di ruolo 2° tipo di ruolo Descrizione Direzione Descrizione Tipo di relazione
Team principale Specialista di progetto RTL è membro di LOGICA
Team principale Analista di sistema RTL è membro di LOGICA
Team principale Analista dei requisiti RTL è membro di LOGICA
Team principale Impiegato tecnico RTL è membro di LOGICA
Team principale Amministratore di sistema RTL è membro di LOGICA
Team principale Ingegnere hardware senior RTL è membro di LOGICA
Team principale Ingegnere hardware RTL è membro di LOGICA
Team principale Ingegnere software senior RTL è membro di LOGICA
Team principale Ingegnere software RTL è membro di LOGICA
Team principale Ingegnere di database RTL è membro di LOGICA
Team principale Assistenza tecnica RTL è membro di LOGICA
Team principale Responsabile QA RTL è membro di LOGICA
Team principale Web Designer RTL è membro di LOGICA
Team principale Ingegnere QA software RTL è membro di LOGICA
Team principale Ufficio progetti RTL è membro di LOGICA
Team principale Ingegnere della sicurezza delle informazioni RTL è membro di LOGICA
Team di supporto Web Designer RTL è membro di LOGICA
Team di supporto Ingegnere QA software RTL è membro di LOGICA
Team di supporto Ufficio progetti RTL è membro di LOGICA
Team di supporto Ingegnere della sicurezza delle informazioni RTL è membro di LOGICA


Tieni presente che party_relationship non è mai un'istanza di un role_type_relationship . Allora a che serve definire relazioni logiche?

Bene, questo è probabilmente spiegato meglio a titolo di esempio. Immagina di voler inviare una lettera a tutti i dipendenti che sono logicamente membri del team di supporto. Per creare una mailing list, dovresti scrivere una query che restituisca tutti i ruoli di interazione del LOGICAL Support Team 2 uniti agli stessi ruoli di interazione REAL 2, uniti a party_relationship , unito al 2 interlocutore party . Ciò ti consentirebbe di ottenere i nomi e gli indirizzi di tutti gli interessati.

Un caso speciale

Potresti aver notato un paio di voci insolite nel role_type tabella di metadati, ovvero:


Tipo di ruolo Tipo di festa
Persona
Lo stesso Organizzazione


Questi sono due casi di un caso speciale, che si verifica quando una parte ha una relazione riflessiva con se stessa:


1° tipo di ruolo 2° tipo di ruolo Descrizione Direzione Descrizione Tipo di relazione
Analista di sistema LTR occupato REALE


Ad esempio, per un analista di sistema autonomo, gli interagenti 1 e 2 in party_relationship fare riferimento alla stessa party riga, ovvero entrambe le colonne della chiave esterna contengono esattamente lo stesso party.ID valore.

L'importanza di avere un contesto

Immagina di avere un piccolo team di analisi formato sostanzialmente dal ramo tra il project manager e l'impiegato tecnico:


1° tipo di ruolo 2° tipo di ruolo Descrizione Direzione Descrizione Tipo di relazione
Piccolo team di analisi Responsabile del progetto RTL responsabili REALE
Responsabile del progetto Analista di sistema LTR gestisce REALE
Analista di sistema Analista dei requisiti LTR gestisce REALE
Analista dei requisiti Impiegato tecnico LTR gestisce REALE


Ciascuna delle relazioni qui esiste anche nella struttura del team di sviluppo del progetto. Quindi, come possiamo differenziare un rapporto tra project manager → analista di sistema da un altro?

Usiamo il contesto opzionale chiave esterna tra role_type_relationship e role_type . Per il piccolo team di analisi, impostiamo il contesto su tutte le relazioni con il "piccolo team di analisi", l'elemento di primo livello. E facciamo lo stesso genere di cose per la struttura del team di sviluppo del progetto. Quando attraversiamo la struttura, lo facciamo solo per il tipo di squadra che ci interessa.

Pro e contro del modello di distinta base delle relazioni tra le parti

Se hai letto i miei altri articoli sull'argomento, probabilmente hai indovinato che sono un fan del modello di progettazione Bill of Materials. È semplice, ma molto potente. L'avvertenza è che deve essere utilizzata in modo appropriato e adattata in modo che la tua implementazione rimanga gestibile.

In questa implementazione delle relazioni tra parti del modello BOM, ci assicuriamo che le nostre relazioni rimangano accurate definendo innanzitutto le relazioni consentite tra gli interagenti che esistono nel nostro dominio. Ciò, ad esempio, impedirebbe all'Internal Revenue Service di essere "assunto" come web designer presso ABC Software Inc.

Quali possibilità emergono dalla definizione di relazioni in questo modo? Bene, la tua organizzazione potrebbe aver bisogno di sapere per quali altre organizzazioni hanno lavorato i tuoi attuali dipendenti e appaltatori. Questo aiuta a evitare possibili conflitti di interesse o addirittura frodi. Un esempio di questo è un'organizzazione di aggiudicazione. Ha bisogno di sapere in quali scuole i suoi valutatori hanno insegnato in precedenza per assicurarsi che non valutino le carte d'esame di quelle scuole. In un modello di relazione di partito, è facile interrogare e ottenere tali informazioni.

D'altra parte, la tua organizzazione potrebbe voler archiviare le stesse informazioni perché potrebbero presentare opportunità di business. Dipende solo dal tuo dominio.

In breve, le informazioni che puoi ottenere da dati ben strutturati sulle relazioni tra le parti possono essere inestimabili.