sql >> Base de Datos >  >> RDS >> Sqlserver

Diseño de relaciones 1:1 y 1:m en SQL Server

Cualquier relación requiere que la tabla "principal" (un lado) tenga una clave principal (o única) (PK), que identifique de manera única cada fila, y la tabla "secundaria" (el otro lado) tenga una columna o columnas de clave externa , que debe rellenarse con valores que sean iguales a algunos valores existentes de la clave principal en la tabla principal. Si desea una relación de uno a muchos (1-M), entonces la clave externa debe ser un atributo ordinario (columna o columnas) en la tabla secundaria que se puede repetir (puede haber muchas filas con el mismo valor)

Si desea una relación uno a uno (1-1), entonces la clave externa debe ser una clave principal o un índice único en la tabla secundaria que garantice que puede haber como máximo una fila en la tabla secundaria con ese valor.

Una relación 1-1 divide efectivamente los atributos (columnas) de una tabla en dos tablas. Esto se llama segmentación vertical. Esto se hace a menudo para subclases las entidades de la tabla o, por otro motivo, si los patrones de uso de las columnas de la tabla indican que es necesario acceder a algunas de las columnas con mucha más frecuencia que al resto de las columnas. (Digamos que se accederá a una o dos columnas miles de veces por segundo y se accederá a las otras 40 columnas solo una vez al mes). Particionar la tabla de esta manera optimizará el patrón de almacenamiento para esas dos consultas diferentes.

Subclasificación . Lo anterior en realidad crea una relación de 1 a cero o uno, que se utiliza para lo que se denomina una relación de subclase o subtipo. Esto ocurre cuando tienes dos entidades diferentes que comparten una gran cantidad de atributos, pero una de las entidades tiene atributos adicionales que la otra no necesita. Un buen ejemplo podría ser Empleados y Empleados Asalariados . El Empleado la tabla tendría todos los atributos que comparten todos los empleados, y el Empleado asalariado la tabla existiría en una relación (1-0/1) con Empleados, con los atributos adicionales (Salario , Vacaciones anuales , etc.) que solo necesitan los asalariados.

Si realmente desea una relación 1-1, debe agregar otro mecanismo para garantizar que la tabla secundaria siempre tendrá un registro para cada registro/fila en la tabla principal. Por lo general, la única forma de hacerlo es imponiéndolo en el código utilizado para insertar datos (ya sea en un disparador, un procedimiento almacenado o un código fuera de la base de datos). Esto se debe a que si agregó restricciones de integridad referencial en dos tablas que requieren que las filas estén siempre en ambas, no sería posible agregar una fila a ninguna sin violar una de las restricciones, y no puede agregar una fila a ambas. mesas al mismo tiempo.