sql >> Base de Datos >  >> RDS >> Mysql

Relaciones de identificación vs no identificación (¡¡¡Otra vez!!!)

Está pensando demasiado en el vínculo entre la opcionalidad y la identidad. Hasta que todo te resulte más natural, lo mejor es pensar en ellos como completamente ajenos. .

Sobre la opcionalidad, es importante recordar que la opcionalidad es direccional. Para usar su ejemplo de employee_equipment :Claro, los empleados no necesitan equipo. La relación de uno a muchos de employee a employee_equipment es opcional. Al mismo tiempo, mirándolo desde la perspectiva opuesta, la relación es obligatoria. No puede tener un registro en employee_equipment a menos que haya un employee para asociarlo.

La identidad no tiene nada que ver con la opcionalidad, excepto casualmente una relación de identificación es obligatoria del niño al padre. Si también es obligatorio de los padres al niño no está ni aquí ni allá en lo que respecta a la identidad.

Lo que hace que una relación se identifique es que tienes que saber de qué padre estás hablando (así como algunas otras cosas) para saber de qué niño estás hablando. Es decir, la clave principal del hijo debe incluir una clave externa para el padre.

Tablas de intersección pura (por ejemplo, employee_equipment ) son buenos ejemplos de esto. La clave principal de una intersección pura es la combinación de las claves foráneas de ambas tablas principales. Tenga en cuenta que algunas personas también pueden agregar una clave sustituta a este tipo de tablas. No importa tanto desde la perspectiva de la identidad si hay varias claves candidatas. Lo que es importante para determinar la identidad es si la clave externa es parte de una clave candidata, ya sea que esa clave candidata sea o no la clave principal.

Otro buen ejemplo sería algo así como el catálogo de metadatos de una base de datos, donde una columna se identifica por la tabla a la que pertenece, al igual que la tabla se identifica por el esquema en el que se encuentra, y así sucesivamente. Sabiendo que una columna se llama NAME no te dice qué columna es. Sabiendo que es el NAME columna en el CUSTOMER la mesa ayuda. (También tendrá que saber qué esquema CUSTOMER está dentro, etc.).