Backend Databases

Integridad Referencial: Guía Definitiva sobre PK, FK y Reglas de Borrado

Domina las relaciones entre tablas y las acciones referenciales (CASCADE, RESTRICT, SET NULL). Aprende qué sucede realmente cuando borras datos en sistemas productivos.

12 min
Databases SQL Data Integrity Backend

Diseñar una base de datos no es solo crear tablas y llenarlas de datos; es definir las reglas de juego que mantendrán la consistencia de la información a lo largo del tiempo. Aquí es donde entra la Integridad Referencial.

Si alguna vez te has preguntado por qué no puedes borrar un cliente que tiene facturas asociadas, o por qué al borrar una categoría desaparecieron todos sus productos, estás ante el comportamiento de las Foreign Keys (FK) y sus reglas de acción. En este artículo, exploraremos cómo dominar estas relaciones para construir sistemas robustos y a prueba de errores.

El Pegamento de los Datos: PK vs. FK

Para que exista integridad, primero debemos entender los dos pilares de las relaciones:

  1. Primary Key (PK): Es el identificador único de un registro en su propia tabla. No puede ser nulo ni repetirse. Es el “DNI” de la fila.
  2. Foreign Key (FK): Es una columna en una tabla (hija) que apunta a la PK de otra tabla (padre). Su función es establecer un vínculo oficial entre ambos registros.

La Integridad Referencial es el estado en el que cada valor de una FK apunta efectivamente a una PK existente. Sin ella, tendríamos “registros huérfanos”: pedidos que no pertenecen a nadie o comentarios de usuarios que ya no existen.

Acciones Referenciales: ¿Qué pasa al borrar o actualizar?

Cuando intentamos modificar o eliminar un registro “padre” que tiene “hijos” vinculados, el motor de la base de datos consulta las reglas definidas en la FK. Estas son las opciones principales:

1. ON DELETE RESTRICT / NO ACTION (El muro de seguridad)

Es el comportamiento por defecto en la mayoría de los motores.

  • Qué hace: Impide la eliminación del padre si existen hijos vinculados.
  • Cuándo usarlo: Casi siempre. Es la opción más segura para evitar pérdidas accidentales de datos relacionados.
  • Ejemplo: No puedes borrar un Cliente si tiene Facturas pendientes.

2. ON DELETE CASCADE (El efecto dominó)

  • Qué hace: Si borras al padre, el motor borra automáticamente a todos sus hijos.
  • Cuándo usarlo: En relaciones de “composición” donde el hijo no tiene sentido sin el padre.
  • Ejemplo: Si borras un Post en un blog, tiene sentido que se borren en cascada todos sus Comentarios.
  • Peligro: ¡Cuidado! Un CASCADE mal configurado en una tabla principal puede vaciar media base de datos en milisegundos.

3. ON DELETE SET NULL

  • Qué hace: Borra al padre, pero mantiene a los hijos, poniendo su FK en NULL.
  • Cuándo usarlo: Cuando quieres conservar el registro hijo por motivos estadísticos o históricos, aunque pierda su relación directa.
  • Ejemplo: Si un Vendedor deja la empresa, podrías poner en NULL el campo vendedor_id en la tabla Ventas para no perder el registro de la transacción.

Estrategias en Sistemas Productivos

En entornos reales y escalables, la teoría a veces choca con la práctica. Aquí algunas estrategias usadas por ingenieros senior:

El debate: Soft Delete vs. Hard Delete

Hoy en día, muchas empresas evitan el DELETE físico de SQL. En su lugar, usan una columna deleted_at.

  • Ventaja: Los datos son recuperables y la integridad referencial se mantiene intacta porque el registro nunca se borra técnicamente.
  • Desventaja: Las consultas se vuelven más complejas (siempre hay que filtrar WHERE deleted_at IS NULL) y las FKs ya no protegen contra “borrados lógicos”.

¿Cuándo evitar las FKs a nivel de base de datos?

Aunque parezca una herejía, sistemas de escala masiva (como YouTube o servicios de microservicios distribuidos) a veces omiten las FKs físicas para:

  1. Ganar performance: Validar una FK en cada insert tiene un costo de CPU y bloqueo de tablas.
  2. Facilitar el Sharding: Las FKs no funcionan fácilmente cuando los datos están repartidos en múltiples servidores físicos.

Nota: Solo haz esto si tu capa de aplicación es extremadamente robusta validando la integridad.

Casuística Real: El caso de la Facturación

Imagina este escenario:

  • Tabla Productos (PK: id)
  • Tabla DetalleFactura (FK: producto_id)

Si usas CASCADE, al borrar un producto que ya no vendes, ¡borrarás el historial de ventas de hace 5 años! Esto es un desastre contable. La solución: Usa RESTRICT para evitar el borrado, o mejor aún, implementa un estado activo = false en el producto.

Resumen de Mejores Prácticas

  1. Por defecto, usa RESTRICT: Sé conservador. Es mejor que el sistema te lance un error a que borre datos por accidente.
  2. Usa CASCADE solo en sub-recursos: Úsalo solo cuando la relación sea de propiedad total (ej. Carrito -> ItemsCarrito).
  3. Indices en FKs: Asegúrate de que todas tus columnas FK tengan un índice. Esto acelera drásticamente las comprobaciones de integridad del motor.
  4. Consistencia en ON UPDATE: Generalmente, se recomienda ON UPDATE CASCADE si tus PKs pueden cambiar (aunque si usas IDs autoincrementales, esto casi nunca sucederá).

Conclusión

La integridad referencial es el cinturón de seguridad de tus datos. Entender cómo funcionan las reglas ON DELETE y ON UPDATE te permite dormir tranquilo sabiendo que tu base de datos rechazará cualquier operación que pueda corromper la lógica de tu negocio.

¿Has tenido alguna mala experiencia con un ON DELETE CASCADE accidental? ¡Comparte tu historia en los comentarios para que otros no cometan el mismo error!

¿Tienes un proyecto en mente?

Convierte tu idea en un producto real

Desarrollo web, aplicaciones a medida y consultoría tecnológica para empresas y startups. Cuéntame tu proyecto y te respondo en menos de 24 horas.

Solicitar presupuesto Ver LinkedIn