7. Representación de relaciones mediante pares ordenados

Los pares ordenados son una forma directa y precisa de representar relaciones discretas. Cada par indica un vínculo concreto entre un elemento de origen y un elemento de destino.

7.1 Introducción

Una relación discreta puede representarse de varias maneras: pares ordenados, tablas, matrices o grafos. La representación mediante pares ordenados es una de las más simples, porque enumera explícitamente cada vínculo existente.

Esta forma es muy útil cuando queremos definir una relación con claridad, verificar si un vínculo existe o construir ejemplos pequeños antes de pasar a representaciones más compactas.

7.2 Forma general

Una relación R puede escribirse como un conjunto de pares ordenados. Cada par tiene la forma (a, b).

R = {(a, b), (c, d), (e, f)}

El primer componente suele representar el origen, la entrada, el sujeto o el elemento inicial. El segundo componente representa el destino, la salida, el objeto relacionado o el elemento final.

7.3 Ejemplo con usuarios y permisos

Si queremos representar qué permisos tiene cada usuario, podemos usar pares ordenados.

R = { (Ana, leer), (Ana, editar), (Luis, leer), (Marta, comentar) }

El par (Ana, editar) indica que Ana tiene permiso para editar. El par (Luis, editar) no aparece, por lo tanto ese permiso no está asignado a Luis dentro de esta relación.

7.4 Lectura de pares ordenados

La lectura de un par depende del significado de la relación. No basta con mirar los datos: también hay que conocer la regla que interpreta el vínculo.

Relación Par ordenado Lectura
usuario tiene permiso (Ana, leer) Ana tiene permiso para leer.
producto pertenece a categoría (teclado, periféricos) El teclado pertenece a la categoría periféricos.
ciudad conecta con ciudad (Córdoba, Rosario) Hay una conexión desde Córdoba hacia Rosario.
tarea depende de tarea (interfaz, API) La interfaz depende de la API.

7.5 El orden importa

En un par ordenado, cambiar el orden puede cambiar completamente el significado.

(interfaz, API) significa: interfaz depende de API. (API, interfaz) significa: API depende de interfaz.

Esos dos pares no son equivalentes. Por eso esta representación es adecuada para relaciones dirigidas, como dependencias, rutas, transiciones y asignaciones.

7.6 Representación en JavaScript

En JavaScript, podemos representar una relación como una lista de arreglos de dos posiciones. Cada arreglo interno representa un par ordenado.

const permisos = [
  ["Ana", "leer"],
  ["Ana", "editar"],
  ["Luis", "leer"],
  ["Marta", "comentar"]
];

console.log(permisos);

Esta representación es simple y permite recorrer la relación con estructuras habituales del lenguaje.

7.7 Verificar pertenencia

Una consulta común consiste en preguntar si un par pertenece a una relación. En código, esto equivale a buscar si existe un par con ambos componentes.

const permisos = [
  ["Ana", "leer"],
  ["Ana", "editar"],
  ["Luis", "leer"]
];

function contienePar(relacion, origen, destino) {
  return relacion.some(([a, b]) => a === origen && b === destino);
}

console.log(contienePar(permisos, "Ana", "editar"));
console.log(contienePar(permisos, "Luis", "editar"));

7.8 Construir una relación desde una regla

También podemos construir una relación mediante una condición. Por ejemplo, sobre el conjunto {1, 2, 3, 4}, definimos que a está relacionado con b si a < b.

const conjunto = [1, 2, 3, 4];

const menorQue = conjunto.flatMap(a =>
  conjunto
    .filter(b => a < b)
    .map(b => [a, b])
);

console.log(menorQue);

El resultado es el conjunto de pares ordenados que cumplen la regla.

7.9 Evitar pares repetidos

Como una relación es un conjunto de pares, no debería contener pares repetidos. En programación, si usamos arreglos, debemos controlar esa duplicación manualmente.

const relacionConRepetidos = [
  ["Ana", "leer"],
  ["Ana", "leer"],
  ["Luis", "editar"]
];

const clavesUnicas = new Set();
const relacionSinRepetidos = [];

for (const par of relacionConRepetidos) {
  const clave = JSON.stringify(par);
  if (!clavesUnicas.has(clave)) {
    clavesUnicas.add(clave);
    relacionSinRepetidos.push(par);
  }
}

console.log(relacionSinRepetidos);

La clave generada permite detectar cuándo dos pares tienen los mismos componentes en el mismo orden.

7.10 Relación vacía y relación universal

Dentro de un producto cartesiano, hay dos casos extremos: la relación vacía y la relación universal.

Relación Descripción Ejemplo
Relación vacía No contiene ningún par. R = {}
Relación universal Contiene todos los pares del producto cartesiano. R = A × B

Entre esos dos extremos se encuentran la mayoría de las relaciones que se usan en problemas reales.

7.11 Ventajas y límites de esta representación

Aspecto Detalle
Ventaja Es clara, explícita y fácil de leer para relaciones pequeñas.
Ventaja Permite consultar pertenencia, dominio e imagen de forma directa.
Límite Puede ocupar mucho espacio si la relación tiene muchos pares.
Límite No siempre es la forma más eficiente para cálculos repetidos o relaciones densas.

7.12 Qué debes recordar de este tema

  • Una relación puede representarse como un conjunto de pares ordenados.
  • Cada par ordenado indica un vínculo concreto entre dos elementos.
  • El orden de los componentes importa.
  • En JavaScript, una relación puede representarse como un arreglo de pares.
  • Una relación no debería contener pares repetidos.
  • La representación por pares es clara para relaciones pequeñas y ejemplos didácticos.

7.13 Conclusión

Representar relaciones mediante pares ordenados permite expresar de forma directa qué vínculos existen entre los elementos de dos conjuntos. Es una base sólida para luego pasar a representaciones más compactas o visuales.

En el próximo tema estudiaremos la representación matricial de relaciones, una forma especialmente útil para cálculos y análisis sistemático.