sql >> Base de Datos >  >> RDS >> Database

Patrón de relación de partido. Cómo modelar relaciones

Las relaciones están en todas partes:entre personas, entre organizaciones, entre organizaciones y personas. Piense en ser un empleado de una empresa, ser miembro de un equipo de proyecto o ser una subsidiaria de otra empresa. ¿Existe una forma sencilla de modelar y gestionar con precisión todas estas relaciones? ¿Podemos responder fácilmente a la pregunta '¿Quién conoce a quién?'

Una revisión rápida de las relaciones

Exactamente cómo se derivó este modelo básico se describió en mi artículo anterior, Diseños de listas de materiales (BOM) flexibles y manejables.




En este modelo y en el diseño de BOM convencional, el 1st interactor tiende a ser el Party en la Relationship – empleador en lugar de empleado, líder de equipo en lugar de miembro del equipo, etc.

Así es como se verían los datos (con el papel que juega cada parte entre paréntesis):


1 interactuador 2 interactuadores
Widget Co. Inc. (empleador) Gerente 1 (empleado)
Widget Co. Inc. (empleador) Gerente 2 (empleado)
Widget Co. Inc. (empleador) Empleado 1 (empleado)
Widget Co. Inc. (empleador) Empleado 2 (empleado)
Widget Co. Inc. (empleador) Empleado 3 (empleado)
Widget Co. Inc. (empleador) Empleado 4 (empleado)
Gerente 1 (responsable de) Empleado 1 (informa a)
Gerente 1 (responsable de) Empleado 2 (informa a)
Gerente 2 (responsable de) Empleado 3 (informa a)
Gerente 2 (responsable de) Empleado 4 (informa a)


Un modelo más sofisticado

Imagine que desea modelar un equipo de desarrollo de proyectos como el siguiente:

Fuente:https://www.edrawsoft.com/template-matrix -organigrama.php

La mayoría de los roles en esta jerarquía de equipo son reales, p. el analista de requisitos informa al analista de sistemas. Otra forma de verlo es que el analista de sistemas administra al analista de requisitos.

Las relaciones entre roles se pueden leer de izquierda a derecha (LTR) o de derecha a izquierda (RTL). Normalmente, es mejor ceñirse a una convención u otra, LTR o RTL, pero en la práctica es posible que haya excepciones a esto.

Además, observe que este diagrama muestra diferentes formas de agrupar roles. Algunos roles son reales, como hemos discutido; otros son lógicos, p. el grupo técnico, el grupo de formación, el equipo central y el equipo de apoyo.

Podemos decir que este diagrama define la estructura del equipo utilizando los roles necesarios para completar el equipo de desarrollo del proyecto. Esto es distinto de una instancia real del equipo, que estaría formado por nombres de personas reales en cada uno de los roles.

Por eso necesitamos un modelo de datos que sea flexible y configurable , como este:




Las tablas amarillas contienen metadatos y las tablas azules contienen datos comerciales .

Configuración de metadatos básicos

Comenzaremos completando el party_type mesa. Esta tabla diferencia si un partido es una persona o una organización.

Antes de hacer mucho más, también necesitamos definir roles en el role_type tabla de metadatos:


Nombre Bonito Tipo de fiesta
Impuestos y Aduanas de Su Majestad (HMRC) Organización
Servicio de Impuestos Internos (IRS) Organización
Servicio de pasaporte Organización
Igual Organización
Sociedad Limitada Organización
Sociedad anónima Organización
Solicitante Persona
Yo mismo Persona
Ingeniería CTO Persona
Gerente de Proyecto Persona
Especialista en Proyectos Persona
Analista de sistemas Persona
Analista de requisitos Persona
Representante técnico Persona
Administrador del sistema Persona
Ingeniero de hardware sénior Persona
Ingeniero de hardware Persona
Ingeniero de software sénior Persona
Ingeniero de software Persona
Ingeniero de base de datos Persona
Soporte técnico Persona
Gerente de control de calidad Persona
Diseñador Web Persona
Ingeniero de control de calidad de software Persona
Oficina de Proyectos Persona
Ingeniero de Seguridad de la Información Persona
Técnico Organización
Entrenamiento Organización
Equipo central Organización
Equipo de apoyo Organización


Sin duda habrá notado que cada rol pertenece a una persona o a una organización. Para dar una idea de lo que es posible, he agregado algunas organizaciones externas con las que nuestra sociedad limitada ficticia, ABC Software Inc, tiene relaciones.

Adición de metadatos de empleo

La siguiente tarea es definir los pares de roles válidos entre el primer y el segundo interactor. A su vez, esto define los tipos de relaciones que pueden tener las partes. Comencemos a completar la role_type_relationship tabla de metadatos con los roles de los empleados de la empresa. Después de todo, no podemos crear equipos sin tener trabajadores primero:


1er tipo de rol Segundo tipo de rol Descripción Dirección Descripción Tipo de relación
Sociedad Limitada Ingeniería CTO LTR emplea REAL
Sociedad Limitada Gerente de Proyecto LTR emplea REAL
Sociedad Limitada Especialista en proyectos LTR emplea REAL
Sociedad Limitada Analista de sistemas LTR emplea REAL
Sociedad Limitada Analista de requisitos LTR emplea REAL
Sociedad Limitada Representante técnico LTR emplea REAL
Sociedad Limitada Administrador del sistema LTR emplea REAL
Sociedad Limitada Ingeniero de hardware sénior LTR emplea REAL
Sociedad Limitada Ingeniero de hardware LTR emplea REAL
Sociedad Limitada Ingeniero de software sénior LTR emplea REAL
Sociedad Limitada Ingeniero de software LTR emplea REAL
Sociedad Limitada Ingeniero de base de datos LTR emplea REAL
Sociedad Limitada Soporte técnico LTR emplea REAL
Sociedad Limitada Gerente de control de calidad LTR emplea REAL
Sociedad Limitada Diseñador Web LTR emplea REAL
Sociedad Limitada Ingeniero de control de calidad de software LTR emplea REAL
Sociedad Limitada Oficina de Proyectos LTR emplea REAL
Sociedad Limitada Ingeniero de Seguridad de la Información LTR emplea REAL
Sociedad Limitada Solicitante LTR selecciona REAL


Suponga que ABC Software Inc. va a contratar a dos empleados, Jane Smith y Alex Jones, para los siguientes roles:


Relación entre partidos Relación de tipo de rol
1er Interactor (Organización) Segundo interactuante (Persona) Primer interactuador (función) Segundo interactuante (rol) Descripción
ABC Software Inc. Jane Smith Sociedad Limitada Ingeniería CTO emplea
ABC Software Inc. Alex Jones Sociedad Limitada Gerente de Proyecto emplea


Dando un paso atrás en el tiempo, vería que esta relación comenzó antes de que se contratara a Jane Smith y Alex Jones; tenían que solicitar puestos de trabajo en ABC Software Inc. La relación se habría visto así:


Relación entre partidos Relación de tipo de rol
1er Interactor (Organización) Segundo interactuante (Persona) Primer interactuador (función) Segundo interactuante (rol) Descripción
ABC Software Inc. Jane Smith Sociedad Limitada Solicitante selecciona
ABC Software Inc. Alex Jones Sociedad Limitada Solicitante selecciona


¿Empiezas a ver las posibilidades que el patrón de relación entre partidos apoyos?

No tenemos una tabla llamada applicant y otra tabla llamada employee , como puede encontrarse en otros modelos. Si lo piensa, compartirían muchos de los mismos atributos:nombre, dirección, fecha de nacimiento, etc.; tendrías que copiar los valores de applicant a employee al contratar con éxito. Pero, ¿las personas involucradas se han transformado de una cosa a otra? ¡Por supuesto no! ¡Siguen siendo las mismas personas!

De hecho, solo la relación ha cambiado entre ABC Software Inc. y Jane Smith o Alex Jones. Y esto es precisamente lo que modela el patrón de relaciones partidistas.

Continuación:metadatos del equipo del proyecto

Antes de que podamos crear una party_relationship Para definir el hecho de que Jane Smith administra a Alex Jones, debemos definir la estructura del equipo de desarrollo del proyecto. Esta es solo una cuestión de emparejar los roles principal y secundario para formar una jerarquía válida:


1er tipo de rol Segundo tipo de rol Descripción Dirección Descripción Tipo de relación
Equipo de desarrollo de proyectos Ingeniería CTO RTL clientes potenciales REAL
Ingeniería CTO Gerente de Proyecto LTR gestiona REAL
Gerente de Proyecto Analista de sistemas LTR gestiona REAL
Gerente de Proyecto Administrador del sistema LTR gestiona REAL
Gerente de Proyecto Especialista en proyectos LTR gestiona REAL
Gerente de Proyecto Ingeniero de software sénior LTR gestiona REAL
Gerente de Proyecto Soporte técnico LTR gestiona REAL
Gerente de Proyecto Diseñador Web LTR gestiona REAL
Gerente de Proyecto Ingeniero de control de calidad de software LTR gestiona REAL
Gerente de Proyecto Oficina de Proyectos LTR gestiona REAL
Gerente de Proyecto Ingeniero de Seguridad de la Información LTR gestiona REAL
Gerente de Proyecto Ingeniero de base de datos LTR gestiona REAL
Gerente de Proyecto Soporte técnico LTR gestiona REAL
Gerente de Proyecto Gerente de control de calidad LTR gestiona REAL
Analista de sistemas Analista de requisitos LTR gestiona REAL
Analista de requisitos Representante técnico LTR gestiona REAL
Administrador del sistema Ingeniero de hardware sénior LTR gestiona REAL
Ingeniero de hardware sénior Ingeniero de hardware LTR gestiona REAL
Ingeniero de software sénior Ingeniero de software LTR gestiona REAL


Para todos los roles anteriores, la relación se lee de izquierda a derecha, p. el director del proyecto gestiona el ingeniero de base de datos. Alternativamente, puede adoptar el formato de derecha a izquierda (el ingeniero de la base de datos informa al administrador del proyecto) si esa es su convención preferida.

Finalmente, debemos definir la relación entre nuestros dos nuevos empleados:


Relación entre partidos Relación de tipo de rol
1er Interactor (Organización) Segundo interactuante (persona) Primer interactuador (función) Segundo interactuante (rol) Descripción
Jane Smith Alex Jones Ingeniería CTO Gerente de Proyecto gestiona


Por supuesto, puede tener cualquier número de equipos en la forma de esta jerarquía. En cierto sentido, por lo tanto, party_relationship es una instancia de role_type_relationship . Esto es similar a la forma en que un objeto es una instancia de una clase en la programación orientada a objetos.

Incluyendo metadatos lógicos

Con referencia al diagrama del equipo de desarrollo del proyecto, también podemos definir las siguientes relaciones lógicas entre roles :


1er tipo de rol Segundo tipo de rol Descripción Dirección Descripción Tipo de relación
Equipo central Especialista en proyectos RTL es miembro de LOGICO
Equipo central Analista de sistemas RTL es miembro de LOGICO
Equipo central Analista de requisitos RTL es miembro de LOGICO
Equipo central Representante técnico RTL es miembro de LOGICO
Equipo central Administrador del sistema RTL es miembro de LOGICO
Equipo central Ingeniero de hardware sénior RTL es miembro de LOGICO
Equipo central Ingeniero de hardware RTL es miembro de LOGICO
Equipo central Ingeniero de software sénior RTL es miembro de LOGICO
Equipo central Ingeniero de software RTL es miembro de LOGICO
Equipo central Ingeniero de base de datos RTL es miembro de LOGICO
Equipo central Soporte técnico RTL es miembro de LOGICO
Equipo central Gerente de control de calidad RTL es miembro de LOGICO
Equipo central Diseñador Web RTL es miembro de LOGICO
Equipo central Ingeniero de control de calidad de software RTL es miembro de LOGICO
Equipo central Oficina de Proyectos RTL es miembro de LOGICO
Equipo central Ingeniero de Seguridad de la Información RTL es miembro de LOGICO
Equipo de apoyo Diseñador Web RTL es miembro de LOGICO
Equipo de apoyo Ingeniero de control de calidad de software RTL es miembro de LOGICO
Equipo de apoyo Oficina de Proyectos RTL es miembro de LOGICO
Equipo de apoyo Ingeniero de Seguridad de la Información RTL es miembro de LOGICO


Tenga en cuenta que party_relationship nunca es una instancia de una role_type_relationship . Entonces, ¿cuál es el punto de definir relaciones lógicas?

Bueno, probablemente esto se explique mejor con un ejemplo. Imagina que quisieras enviar una carta a todos los empleados que lógicamente son miembros del equipo de soporte. Para crear una lista de correo, debe escribir una consulta que devuelva todos los roles de interactuador del Equipo de soporte LÓGICO 2 unidos a los mismos roles de interactuador REAL 2, unidos a party_relationship , se unió a la party . Esto le permitiría obtener los nombres y direcciones de todos los interesados.

Un caso especial

Es posible que haya notado un par de entradas inusuales en el role_type tabla de metadatos, a saber:


Tipo de rol Tipo de fiesta
Yo mismo Persona
Igual Organización


Estas son dos instancias de un caso especial, que ocurre cuando una parte tiene una relación reflexiva consigo misma:


1er tipo de rol Segundo tipo de rol Descripción Dirección Descripción Tipo de relación
Yo mismo Analista de sistemas LTR empleado REAL


Por ejemplo, para un analista de sistemas autónomo, los interactuadores 1 y 2 en party_relationship referirse de nuevo a la misma party fila:es decir, ambas columnas de clave externa contienen exactamente el mismo party.ID valor.

La importancia de tener contexto

Imagine que tenemos un pequeño equipo de análisis que se forma básicamente a partir de la rama entre el director del proyecto y el empleado técnico:


1er tipo de rol Segundo tipo de rol Descripción Dirección Descripción Tipo de relación
Pequeño equipo de análisis Gerente de Proyecto RTL clientes potenciales REAL
Gerente de Proyecto Analista de sistemas LTR gestiona REAL
Analista de sistemas Analista de requisitos LTR gestiona REAL
Analista de requisitos Representante técnico LTR gestiona REAL


Cada una de las relaciones aquí también existe en la estructura del equipo de desarrollo del proyecto. Entonces, ¿cómo diferenciamos una relación de gerente de proyecto → analista de sistemas de otra?

Usamos el contexto opcional clave externa entre role_type_relationship y role_type . Para el pequeño equipo de análisis, establecemos el contexto de todas las relaciones en "pequeño equipo de análisis", el elemento de nivel superior. Y hacemos lo mismo con la estructura del equipo de desarrollo de proyectos. Cuando atravesamos la estructura, lo hacemos solo para el tipo de equipo que nos interesa.

Pros y contras del patrón de lista de materiales de relación de grupo

Si ha leído mis otros artículos sobre el tema, probablemente haya adivinado que soy un fanático del patrón de diseño de la Lista de materiales. Es simple, pero muy poderoso. La advertencia es que debe usarse de manera adecuada y debe adaptarse para que su implementación siga siendo manejable.

En esta implementación de relación de partes del patrón BOM, nos aseguramos de que nuestras relaciones sigan siendo precisas definiendo primero las relaciones permitidas entre los interactuadores que existen en nuestro dominio. Esto, por ejemplo, evitaría que el Servicio de Impuestos Internos sea "empleado" como diseñador web en ABC Software Inc.

¿Qué posibilidades surgen de definir las relaciones de esta manera? Bueno, es posible que su organización necesite saber para qué otras organizaciones han trabajado sus empleados y contratistas actuales. Esto ayuda a evitar posibles conflictos de intereses o incluso fraudes. Un ejemplo de esto es una organización de adjudicación. Necesita saber en qué escuelas han enseñado previamente sus evaluadores para asegurarse de que no evalúen los exámenes de esas escuelas. En un modelo de relación partidista, es fácil consultar y obtener esa información.

Por otro lado, es posible que su organización desee almacenar la misma información porque podría presentar oportunidades comerciales. Solo depende de tu dominio.

En resumen, la información que puede obtener de los datos bien estructurados de las relaciones con las partes puede ser invaluable.