Tengo las siguientes tablas en el servidor MySQL:Cómo hacer cumplir únicos de varias tablas
Companies:
- UID (unique)
- NAME
- other relevant data
Offices:
- UID (unique)
- CompanyID
- ExternalID
- other data
Employees:
- UID (unique)
- OfficeID
- ExternalID
- other data
En cada uno de ellos es el UID identificador único, creado por la base de datos.
Hay claves externas para asegurar los enlaces entre Empleado -> Oficina -> Compañía en el UID.
Los campos ExternalID en Oficinas y Empleados es el ID proporcionado a mi aplicación por la Compañía (mi cliente (s) en realidad). Los clientes no tienen (y no les importa) mis propios ID, y todos los datos que mi aplicación recibe de ellos se identifican únicamente en función de sus ID (es decir, ExternalID en mis tablas).
I.e. una solicitud del cliente en pseudo-lenguaje es como "Soy empresa X, actualizar los datos para mi empleado Y".
Necesito forzar la exclusividad en la combinación de CompanyID y Employees.ExternalID, por lo que en mi base de datos no habrá duplicados de ExternalID para los empleados de la misma empresa.
Estaba pensando en 3 soluciones posibles:
cambiar el esquema para que los empleados incluyen CompanyID, y crear restricción único en los dos campos.
Aplicar un disparador, que al actualizar/insertar en Empleados valida la exclusividad.
Haga cumplir la verificación del nivel de aplicación (es decir, mi servicio de recepción).
Mi alternativa dbadmin-en-me EFS que (3) es la peor solución, ya que no protege la base de datos de inconsistencia en caso de fallo en la aplicación o alguna otra cosa, y muy probablemente será el más lento uno.
La solución desencadenante puede ser lo que quiero, pero puede ser complicado, especialmente si se deben realizar varias inserciones/actualizaciones en una sola declaración, y no estoy seguro del rendimiento frente a (1).
Y (1) parece el enfoque más rápido y más fácil, pero va en contra de mi comprensión del modelo relacional.
Lo que opinan los expertos de SO DB son los pros y los contras de cada uno de los enfoques, especialmente si existe la posibilidad de agregar un nivel adicional de direccionamiento indirecto - es decir, Empresa -> Oficina -> Departamento -> Empleado, y la misma singularidad necesita ser preservado (Compañía/Empleado).
@OMG: Sí, las claves externas son claves foráneas. No los agregué en la Q por simplicidad. Gracias de todos modos por descubrir esto. Voy a editar la Q. –