Bases de datos
Relaciones y cardinalidad
Cómo se dibuja una relación en notación Barker, qué significan la pata de gallo y el trazo punteado, y cómo leer una relación en voz alta para verificar que sea correcta.
Una relación se lee en dos direcciones
Una relación es una línea entre dos entidades que representa un vínculo del negocio: un profesor dicta cursos, un curso es dictado por un profesor.
Lo primero que hay que entender, y lo que más cuesta al principio: la línea tiene dos mitades, y cada mitad se lee por separado. “Un profesor dicta muchos cursos” y “un curso lo dicta un solo profesor” son dos afirmaciones distintas sobre la misma línea, y cada una se dibuja en su extremo.
Cada mitad responde dos preguntas independientes:
| Pregunta | Nombre | Respuestas posibles |
|---|---|---|
| ¿Cuántos? | Cardinalidad | Uno / muchos |
| ¿Es obligatorio? | Opcionalidad | Debe / puede |
Dos preguntas con dos respuestas cada una dan cuatro combinaciones por extremo, y ahí está todo el vocabulario de las relaciones.
Los símbolos de la línea
En notación Barker, cada extremo se dibuja combinando dos cosas: la terminación (cuántos) y el tipo de trazo de esa mitad (obligatorio o no).
| Elemento | Se ve así | Significa |
|---|---|---|
| Terminación simple | ─── | Uno y solo uno |
| Pata de gallo (crow’s foot) | ───< | Uno o más |
| Media línea continua | ─── | Obligatorio (must be) |
| Media línea punteada | - - - | Opcional (may be) |
La pata de gallo se llama así porque el trazo que se abre en tres parece una huella de ave. Es el símbolo más reconocible de todo el modelado de datos, y siempre significa lo mismo: muchos, de este lado.
PROFESOR CURSO
┌──────────┐ ┌──────────┐
│ │────────────────────────<│ │
└──────────┘ └──────────┘
↑ ↑
obligatorio, uno obligatorio, muchos
"un curso lo dicta "un profesor dicta
un solo profesor" uno o más cursos"La confusión número uno al empezar: la pata de gallo va del lado del “muchos”, que es el lado opuesto al que la frase menciona primero. “Un profesor dicta muchos cursos” pone la pata de gallo tocando CURSO, no PROFESOR. El símbolo describe cuántas instancias de esa entidad participan.
Leer una relación en voz alta
Barker define una fórmula para leer relaciones, y usarla no es un detalle de estilo: es la forma de verificar que el diagrama dice lo que creías. Al leerlo en voz alta, un modelo mal dibujado suena obviamente falso.
Cada <ENTIDAD A> debe / puede <verbo> uno y solo uno / uno o más <ENTIDAD B>
↑ ↑ ↑
de dónde opcionalidad cardinalidad
salgo del OTRO extremo del OTRO extremoCon el ejemplo de arriba, las dos lecturas:
Cada CURSO debe ser dictado por uno y solo un PROFESOR. Cada PROFESOR debe dictar uno o más CURSOS.
Y aquí el detalle que hace que esto funcione: los símbolos que usas para leer están en el extremo contrario al que empiezas. Al leer “cada CURSO…”, miras el extremo que toca a PROFESOR.
Cuando un modelo te parezca dudoso, léelo en voz alta en las dos direcciones y pregúntate si eso es verdad en el negocio real. “Cada profesor debe dictar uno o más cursos” suena razonable… hasta que alguien contrata a un profesor en enero para que empiece en marzo. Ese caso, leído en voz alta, revela que el extremo debía ser opcional.
Las cuatro combinaciones de un extremo
────────── obligatorio, uno "debe ser uno y solo uno"
- - - - - opcional, uno "puede ser uno y solo uno"
─────────< obligatorio, muchos "debe ser uno o más"
- - - - -< opcional, muchos "puede ser cero, uno o más"La última merece atención: opcional + muchos significa “cero o más”. Es el extremo más frecuente en modelos reales, porque describe la situación normal de “todavía no tiene ninguno, pero podría tener varios”.
Los tres tipos de relación
Combinando la cardinalidad de los dos extremos salen tres tipos, y se nombran por esa combinación.
Uno a muchos (1:N) — la más común
PROFESOR CURSO
┌──────────┐ ┌──────────┐
│ │- - - - - - - - - - - - <│ │
└──────────┘ └──────────┘Cada CURSO debe ser dictado por uno y solo un PROFESOR. Cada PROFESOR puede dictar uno o más CURSOS.
Fíjate en que el trazo del lado de PROFESOR es punteado: eso hace opcional el lado “muchos”, permitiendo el profesor recién contratado que todavía no dicta nada. El lado de CURSO sigue continuo, porque un curso sin profesor no tiene sentido.
Esta es la relación que más vas a dibujar: un cliente tiene muchos pedidos, una categoría tiene muchos productos, un país tiene muchas ciudades.
Uno a uno (1:1) — la más rara
EMPLEADO CREDENCIAL
┌──────────┐ ┌──────────┐
│ │- - - - - - - - - - - - - │ │
└──────────┘ └──────────┘Cada CREDENCIAL debe pertenecer a uno y solo un EMPLEADO. Cada EMPLEADO puede tener una y solo una CREDENCIAL.
Sin pata de gallo en ningún extremo. Es poco frecuente, y cuando aparece conviene desconfiar: si los dos lados son obligatorios y siempre van juntos, casi siempre deberían ser una sola entidad con más atributos.
Se justifica en tres casos concretos: cuando una parte de los datos es opcional y estaría vacía la mayor parte del tiempo, cuando un subconjunto necesita permisos de acceso distintos, o cuando una entidad tiene muchísimos atributos y conviene partirla.
Muchos a muchos (N:M)
ALUMNO CURSO
┌──────────┐ ┌──────────┐
│ │>- - - - - - - - - - - - <│ │
└──────────┘ └──────────┘Cada ALUMNO puede estar inscripto en uno o más CURSOS. Cada CURSO puede tener inscriptos uno o más ALUMNOS.
Pata de gallo en los dos extremos. Es perfectamente válida en el modelo conceptual, pero no se puede implementar así en una base de datos relacional y además esconde un problema: la fecha de inscripción y la nota del enunciado del instituto no tienen dónde ir. Esa es la página siguiente.
Tabla resumen
| Tipo | Extremo izquierdo | Extremo derecho | Ejemplo |
|---|---|---|---|
| 1:1 | uno | uno | Empleado ↔ credencial |
| 1:N | uno | muchos | Profesor → cursos |
| N:M | muchos | muchos | Alumnos ↔ cursos |
Y para la opcionalidad, la pregunta que la decide en cada extremo: ¿puede existir una instancia de esta entidad sin estar vinculada a ninguna de la otra? Si la respuesta es sí, ese extremo es punteado.
| Caso | ¿Puede existir solo? | Trazo |
|---|---|---|
| Un curso sin profesor asignado | No, el instituto no lo permite | Continuo |
| Un profesor sin cursos asignados | Sí, recién contratado | Punteado |
| Un pedido sin cliente | No, jamás | Continuo |
| Un cliente sin pedidos | Sí, acaba de registrarse | Punteado |
Nombrar la relación
En Data Modeler cada mitad de la relación lleva su propio nombre, que es el verbo de la frase de lectura:
PROFESOR ────dicta──────────────es dictado por────< CURSOLos nombres útiles son verbos concretos del negocio: dicta, pertenece a, se inscribe en, contiene. Los inútiles son los genéricos —tiene, relacionado con— porque no agregan nada a lo que la línea ya dice. Un diagrama donde todas las relaciones se llaman “tiene” es un diagrama sin información.
El instituto, con sus relaciones
┌──────────────────────┐ ┌──────────────────────┐
│ PROFESOR │ │ CURSO │
├──────────────────────┤ ├──────────────────────┤
│ # id_profesor │- - - - - - - - - -<│ # codigo │
│ * nombre │ dicta │ * nombre │
│ * email │ │ * horas │
│ o telefono │ │ o descripcion │
└──────────────────────┘ └──────────────────────┘
│
┌──────────────────────┐ │
│ ALUMNO │ │
├──────────────────────┤ │
│ # id_alumno │>- - - - - - - - - - - - - - -┘
│ * nombre │ se inscribe en
│ * email │
│ o telefono │
└──────────────────────┘Leído completo:
Cada CURSO debe ser dictado por uno y solo un PROFESOR. Cada PROFESOR puede dictar uno o más CURSOS. Cada ALUMNO puede estar inscripto en uno o más CURSOS. Cada CURSO puede tener inscriptos uno o más ALUMNOS.
Las dos últimas líneas son la relación N:M que todavía hay que resolver.
Pon a prueba
Una veterinaria: “Cada mascota pertenece a un dueño. Un dueño puede tener varias mascotas, o ninguna todavía.”
Una editorial: un libro es escrito por un autor, y un autor puede tener varios libros publicados o ninguno todavía. Completa la lectura en voz alta de las dos mitades.
Cada LIBRO ser escrito por AUTOR.
Cada AUTOR escribir LIBROS.Un sistema de biblioteca dibujó esto:
SOCIO PRESTAMO
┌──────────┐ ┌──────────┐
│ │>─────────────────────────│ │
└──────────┘ └──────────┘Léelo en voz alta en las dos direcciones y di qué afirma que no puede ser cierto.
La lectura literal del dibujo:
Cada SOCIO debe tener uno y solo un PRÉSTAMO. Cada PRÉSTAMO debe corresponder a uno o más SOCIOS.
Las dos afirmaciones son falsas, y por motivos distintos:
1. “Cada socio debe tener uno y solo un préstamo”. Los dos errores están de este lado. El trazo continuo hacia PRÉSTAMO obliga a que todo socio tenga un préstamo, o sea que no se podría dar de alta a un socio nuevo. Y la terminación simple lo limita a uno solo: no podría llevarse dos libros a la vez ni tener historial.
2. “Cada préstamo debe corresponder a uno o más socios”. La pata de gallo está del lado equivocado: un préstamo pertenece a un socio, no a varios. Este es exactamente el error de poner la pata de gallo en la entidad que la frase menciona primero en vez de en la que tiene muchas instancias.
Corregido:
SOCIO PRESTAMO
┌──────────┐ ┌──────────┐
│ │- - - - - - - - - - - - -<│ │
└──────────┘ realiza └──────────┘Cada PRÉSTAMO debe ser realizado por uno y solo un SOCIO. Cada SOCIO puede realizar uno o más PRÉSTAMOS.
Y esa es toda la utilidad de leer en voz alta: el dibujo original parecía razonable de un vistazo, y la lectura dejó los dos errores en evidencia en una frase.
Ordena los pasos para decidir cómo dibujar una relación entre dos entidades.
- Preguntar cuántos X se vinculan con un solo Y (uno o muchos)
- Leer el resultado en voz alta en las dos direcciones para verificarlo
- Poner la pata de gallo en cada extremo donde la respuesta fue "muchos"
- Preguntar cuántos Y se vinculan con un solo X (uno o muchos)
- Escribir el vínculo en palabras: "un X ... un/varios Y"
- Preguntar si un X puede existir sin ningún Y (y al revés)
- Puntear la mitad de la línea de cada extremo que resultó opcional
- Nombrar cada mitad con un verbo concreto del negocio
Siguiente paso
Falta la relación que quedó sin resolver: alumnos y cursos, con pata de gallo en los dos extremos, y un par de datos —la fecha de inscripción y la nota— que no tienen dónde ir — ver Relaciones muchos a muchos.