</>waridocu

Bases de datos

Entidades y atributos

Qué es una entidad y qué la distingue de un atributo, cómo se nombran, qué tipos de atributo existen y los errores clásicos al elegirlos.

bases-de-datosentidadatributoinstanciamodeladodata-modeler

Entidad: una cosa de la que guardo varios datos

Una entidad es un tipo de cosa sobre la que el sistema necesita guardar información: ALUMNO, CURSO, PROFESOR, FACTURA, MASCOTA. No es una cosa concreta, sino la categoría.

Esa distinción tiene nombre:

TérminoQué esEjemplo
EntidadEl tipo, la categoríaALUMNO
InstanciaUn caso concreto de esa entidad“Ana Ruiz, ana@mail.com

Una entidad tiene que cumplir tres condiciones. Si alguna falla, probablemente no sea una entidad:

  1. Es significativa para el negocio. Alguien la nombraría al describir cómo funciona el sistema.
  2. Se guarda más de un dato de ella. Si solo guardas su nombre y nada más, es candidata a ser un atributo de otra cosa.
  3. Puede haber muchas instancias. ALUMNO tiene sentido porque hay muchos alumnos; “el instituto”, del que hay uno solo, casi nunca es una entidad.
Importante

La entidad se nombra en singular y en mayúsculas: ALUMNO, no “Alumnos”. El nombre describe qué es cada instancia. Es una convención, pero es la que usa Data Modeler y toda la bibliografía de Oracle, y respetarla evita ambigüedades al leer un diagrama ajeno.

Cómo se dibuja

En la notación Barker —la que usa Data Modeler por defecto para el modelo lógico— una entidad es una caja de esquinas redondeadas con el nombre arriba y los atributos listados adentro:

texttext
┌──────────────────────────┐
│ ALUMNO                   │
├──────────────────────────┤
│ # id_alumno              │
│ * nombre                 │
│ * email                  │
│ o telefono               │
└──────────────────────────┘

Los símbolos #, * y o delante de cada atributo son el tema de la página siguiente. Por ahora, lo que importa es la estructura: nombre arriba, atributos abajo, uno por línea.

Atributo: un dato de esa cosa

Un atributo describe una propiedad de la entidad. Es un valor único por instancia: cada alumno tiene un nombre, un email.

texttext
┌──────────────────────────┐      Instancias:
│ CURSO                    │      ("JAV-01", "Java Básico", 40)
├──────────────────────────┤      ("BD-01",  "Bases de Datos", 30)
│ # codigo                 │      ("WEB-02", "HTML y CSS", 24)
│ * nombre                 │
│ * horas                  │
│ o descripcion            │
└──────────────────────────┘

Convenciones de nombre para atributos:

ReglaBienMal
En minúsculas, singularnombre, fecha_inicioNOMBRES
Sin repetir el nombre de la entidadALUMNO → nombreALUMNO → nombre_alumno
Describiendo el dato, no su tipofecha_iniciocampo_fecha_1
Sin espacios ni acentostelefonoteléfono de contacto
Nota

La segunda regla tiene una excepción muy extendida: el identificador. id_alumno dentro de ALUMNO repite el nombre de la entidad a propósito, porque ese atributo va a viajar a otras tablas como clave foránea y ahí id a secas sería ambiguo. Es la convención más común, y la que se usa en toda esta sección.

¿Entidad o atributo? El error más frecuente

La duda que aparece siempre: si un curso tiene un profesor, ¿profesor es un atributo de CURSO o una entidad aparte?

La pregunta que lo decide: ¿guardo más de un dato de eso?

texttext
Si de un profesor solo guardo su nombre:
┌──────────────────────────┐
│ CURSO                    │
│ * nombre                 │
│ * profesor          ← atributo, alcanza
└──────────────────────────┘

Si de un profesor guardo nombre, email y teléfono:
┌────────────────┐          ┌──────────────────┐
│ CURSO          │          │ PROFESOR         │
│ * nombre       │──────────│ * nombre         │
└────────────────┘          │ * email          │
                            │ o telefono       │
                            └──────────────────┘

Tres señales de que algo que pusiste como atributo debería ser una entidad:

SeñalEjemplo
El valor se repite idéntico en muchas instanciasEl mismo nombre de profesor escrito en 20 cursos
Querrías guardar datos sobre ese valorEl email de ese profesor
Existe aunque no haya ninguna instancia de la otraUn profesor contratado que todavía no dicta nada

Y una señal en el otro sentido: si al crear una entidad te queda con un solo atributo y no participa de ninguna relación interesante, probablemente era un atributo.

Advertencia

Este mismo criterio decide una duda muy parecida: un atributo pais con el nombre del país escrito a mano se repite miles de veces, se escribe mal (“Argentina”, “argentina”, “Argnetina”) y no se puede validar. Convertirlo en la entidad PAÍS y relacionarlo garantiza que solo existan los países que alguien cargó, escritos de una única manera.

Tipos de atributo que conviene reconocer

Atributo compuesto

Un dato que en realidad son varios juntos:

texttext
* direccion   →   * calle
                  * numero
                  * ciudad
                  o piso

Guardarlo entero como "Av. Siempre Viva 742, Springfield" hace imposible buscar por ciudad sin trucos de texto. Descomponer un atributo compuesto en sus partes es casi siempre lo correcto, salvo que el sistema jamás vaya a necesitar las partes por separado.

Atributo multivaluado

Un dato del que una instancia puede tener varios valores:

texttext
* telefono   →   ¿y si el alumno tiene dos?

La tentación es poner telefono_1, telefono_2, telefono_3. Es un mal arreglo: si aparece un cuarto teléfono hay que cambiar la estructura, y los que sobran quedan vacíos ocupando lugar.

La solución correcta es una entidad aparte, relacionada con la original:

texttext
┌────────────────┐          ┌──────────────────┐
│ ALUMNO         │          │ TELEFONO         │
│ * nombre       │─────────<│ * numero         │
│ * email        │          │ * tipo           │
└────────────────┘          └──────────────────┘

Ahora un alumno puede tener cero, uno o cien teléfonos sin tocar el modelo.

Importante

Esta es la regla que más se viola en bases de datos reales, y siempre con el mismo síntoma: columnas numeradas (tel1, tel2) o una columna de texto con valores separados por comas. Las dos formas hacen que buscar “quién tiene este teléfono” sea incómodo, lento y propenso a errores.

Atributo derivado

Un dato que se puede calcular a partir de otros:

DerivadoSe calcula desde
edadfecha_nacimiento y la fecha de hoy
total de una facturaLa suma de sus líneas
cantidad_alumnos de un cursoContar las inscripciones

Como regla, no se guardan: se calculan al consultarlos. Guardar edad obliga a actualizarla cada cumpleaños, y el día que alguien se olvide, la base miente. Guardar fecha_nacimiento es un dato que no cambia nunca.

Nota

La excepción es el rendimiento: en un sistema con millones de facturas, recalcular el total en cada consulta puede ser caro, y entonces se guarda a propósito. Pero eso es una decisión del modelo físico, tomada con un problema medido delante, no algo que se decida mientras se dibuja el modelo lógico.

El ejemplo del instituto, primer borrador

Volviendo al enunciado del instituto, los sustantivos con varios datos asociados dan estas tres entidades:

texttext
┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
│ ALUMNO           │   │ CURSO            │   │ PROFESOR         │
├──────────────────┤   ├──────────────────┤   ├──────────────────┤
│   nombre         │   │   codigo         │   │   nombre         │
│   email          │   │   nombre         │   │   email          │
│   telefono       │   │   horas          │   │   telefono       │
└──────────────────┘   └──────────────────┘   └──────────────────┘

Falta bastante: cuáles son obligatorios, cuál identifica a cada instancia, y cómo se conectan entre sí. Y falta una entidad que el enunciado esconde — la inscripción, con su fecha y su nota — que va a aparecer cuando lleguemos a las relaciones muchos a muchos.

Pon a prueba

🎯 ¿Entidad o atributo?

Una biblioteca te dice: “De cada libro guardamos título, ISBN y año. Cada libro pertenece a una categoría, y de cada categoría guardamos su nombre, una descripción y quién es el responsable de esa sección.”

¿Cómo se modela la categoría?

  • Funcionaría si de la categoría no se guardara nada más. Pero el enunciado dice que cada categoría tiene descripción y responsable: eso son datos sobre la categoría, y un atributo no puede tener atributos propios.

  • Correcto. Se cumplen las tres señales: el nombre de la categoría se repetiría en cientos de libros, hay datos propios que guardar de ella (descripción, responsable), y una categoría existe aunque todavía no tenga ningún libro.

  • Es exactamente el problema de la planilla del principio: la descripción y el responsable de "Novela" quedarían repetidos en cada libro de esa categoría, y corregir uno solo dejaría la base contradiciéndose a sí misma.

  • Un atributo multivaluado tampoco puede tener atributos propios, así que no resuelve lo de la descripción y el responsable. Y en cualquier caso, la solución correcta para un multivaluado es también una entidad aparte.

💡 Arregla estos atributos

Esta entidad tiene cuatro problemas de diseño de atributos. Encuéntralos y propón la corrección.

texttext
┌────────────────────────────────┐
│ EMPLEADOS                      │
├────────────────────────────────┤
│   nombre_empleado              │
│   direccion_completa           │
│   telefono1                    │
│   telefono2                    │
│   fecha_nacimiento             │
│   edad                         │
└────────────────────────────────┘

1. EMPLEADOS está en plural. La entidad describe qué es cada instancia: debe llamarse EMPLEADO.

2. nombre_empleado repite el nombre de la entidad. Dentro de EMPLEADO, nombre ya es inequívoco. La redundancia solo hace más largo cada nombre sin agregar información.

3. direccion_completa es un atributo compuesto y telefono1/telefono2 uno multivaluado disfrazado. La dirección se descompone en calle, numero, ciudad, codigo_postal. Los teléfonos se sacan a una entidad TELEFONO relacionada, para que un empleado pueda tener los que haga falta sin cambiar la estructura.

4. edad es un atributo derivado. Se calcula desde fecha_nacimiento, así que guardarla obliga a actualizarla cada año y garantiza que tarde o temprano quede desactualizada. Se elimina.

Corregido:

texttext
┌────────────────────────┐        ┌──────────────────┐
│ EMPLEADO               │        │ TELEFONO         │
├────────────────────────┤        ├──────────────────┤
│   nombre               │───────<│   numero         │
│   calle                │        │   tipo           │
│   numero               │        └──────────────────┘
│   ciudad               │
│   codigo_postal        │
│   fecha_nacimiento     │
└────────────────────────┘
🧩 Ordena el código

Ordena los pasos del método para pasar de un enunciado en palabras a un primer borrador de entidades y atributos.

  1. Listar debajo de cada entidad los datos que se guardan de ella
  2. Subrayar los sustantivos: son los candidatos a entidad
  3. Nombrar cada entidad en singular y mayúsculas
  4. Eliminar los atributos derivados que se pueden calcular
  5. Sacar a una entidad aparte los atributos multivaluados
  6. Descomponer los atributos compuestos en sus partes
  7. Descartar los que solo aportan un dato: esos son atributos
  8. Leer el enunciado completo sin escribir nada todavía

Siguiente paso

Las cajas ya tienen sus atributos, pero todos parecen igual de importantes. Falta marcar cuáles son obligatorios, cuáles opcionales y cuál identifica a cada instancia sin lugar a dudas — eso es lo que hacen los símbolos #, * y o — ver Los símbolos: #, * y o.