¿Qué es el arco exclusivo en la base de datos y por qué es malo?

10

Estaba leyendo los errores de diseño de bases de datos más comunes cometidos por el desarrollador Q&A en stackoverflow. En la primera respuesta había una frase sobre arco exclusivo:

Un arco exclusivo es un error común cuando se crea una tabla con dos o más claves foráneas donde una y solo una de ellas puede ser no nula. Gran error. Por un lado, se vuelve mucho más difícil mantener la integridad de los datos. Después de todo, incluso con integridad referencial, nada impide que se establezcan dos o más de estas claves foráneas (a pesar de las complejas restricciones de verificación).

Realmente no entiendo por qué el arco exclusivo es malo. Probablemente no entendí los conceptos básicos. ¿Hay alguna buena explicación sobre arcos exclusivos?

Ali Arda Orhan
fuente

Respuestas:

8

Hasta donde lo entendí hace mucho tiempo, en un arco exclusivo, una tabla contiene una cantidad de columnas que son claves foráneas para otras tablas, pero solo una de ellas se puede configurar a la vez (debido a alguna restricción lógica en el dominio siguiendo del mundo real). Como esta regla no se puede aplicar en la base de datos, se podría crear un registro corrupto donde más de una de estas claves foráneas tenga un valor.

Haré un ejemplo. Considere una aplicación donde una empresa realiza un seguimiento de los camiones que utiliza para entregar bienes. Un camión solo puede estar en uno de los tres lugares al mismo tiempo: puede estar con un empleado, puede estar en un estacionamiento o en un taller de mantenimiento. Esto podría modelarse teniendo una mesa de camiones con Id. De empleado, Id. De estacionamiento y Id. De mantenimiento, haciendo referencia a las tablas de empleado, Garaje de estacionamiento y mantenimiento. No hay forma de hacer cumplir la regla de que solo uno de estos campos se complete en el nivel de la base de datos. Un código incorrecto o alguien con acceso directo a la base de datos podría insertar un registro que tenga dos o tres campos llenos, lo que equivale a corrupción de datos en la base de datos.

JDT
fuente
44
Las tres ubicaciones posibles de camiones son subclases de una superclase, "ubicación de camiones". Hay muchos casos donde las subclases son mutuamente excluyentes. El desafío es cómo modelar clases y subclases en tablas relacionales.
Walter Mitty
Estoy de acuerdo en que hay casos en los que se justifica el uso de este diseño. Sin embargo, también puedo estar de acuerdo con la publicación original de que este patrón se usa MUCHO más de lo que debería. También tiene algunas desventajas muy grandes ...
JDT
66
¿No se puede usar una restricción de verificación? Por ejemplo alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null)). No me gustan los arcos exclusivos, pero se pueden aplicar con una restricción de verificación. Por supuesto, la restricción FK también debe estar presente.
Tulains Córdova
1
Por lo tanto, a pesar de las "restricciones de verificación complejas" de la publicación citada anteriormente. Es posible que pueda hacer una validación realmente sofisticada con restricciones de verificación o diablos, incluso disparadores, que no lo convierten en una buena idea o una muestra de buen diseño. Imagínese haciendo restricciones de verificación en arcos exclusivos con cuatro o cinco columnas ... Además, estoy bastante seguro de que no todos los motores de bases de datos admiten la restricción CHECK . MySQL declara explícitamente en los documentos que las cláusulas CHECK se analizan, pero se ignoran ...
JDT
Esta fuente recomienda un arco exclusivo. Pensamientos?
Alex Moore-Niemi el
4

No hay nada malo en los arcos exclusivos. Simplemente aplique la regla de negocio correspondiente utilizando una restricción de verificación. La mayoría de los principales sistemas de administración de bases de datos admiten restricciones de verificación (Oracle, SQL Server, PostgreSQL). Si está utilizando una herramienta de modelado de datos, existe una buena posibilidad de que su herramienta genere automáticamente el código para implementar la restricción de verificación.

Gary B
fuente
-1

El arco exclusivo es muy útil en el diseño conceptual o lógico. No significa que tenga que implementar de esa manera. En el ejemplo anterior, el diseñador puede decidir implementar el diseño con tres tablas. Uno para la ubicación del estacionamiento, uno para el empleado y otro para el taller de mantenimiento.

Trevor Cummings
fuente