🔗

Relaciones entre Tablas

Tipos de relaciones, dirección de filtro, bidireccionalidad, relaciones activas e inactivas — el motor que conecta tu modelo de datos

Principiante Intermedio
🔢

Tipos de Relaciones

Las tres cardinalidades de relación

En Power BI puedes crear tres tipos de relación según la cardinalidad entre las columnas relacionadas:

1:N

Uno a Muchos (el más común)

Un valor en la tabla "uno" puede aparecer muchas veces en la tabla "muchos". Ejemplo: un cliente puede tener muchas ventas. La clave primaria de DimCliente se relaciona con la clave foránea de FactVentas.

1:1

Uno a Uno (usar con precaución)

Cada valor de una tabla corresponde exactamente a un valor en la otra. Puede indicar que las tablas deberían estar unidas en una sola. Caso legítimo: tablas muy grandes divididas por columnas.

N:N

Muchos a Muchos (avanzado)

Varios valores de una tabla se relacionan con varios valores de la otra. Power BI puede gestionarlo con bridge tables o directamente, pero con implicaciones de rendimiento y complejidad DAX importantes.

📌 Buena práctica: En un esquema estrella bien diseñado, el 95% de tus relaciones son 1:N entre dimensiones (lado "1") y tablas de hechos (lado "N"). Esto es lo que hace que el modelo sea predecible y eficiente.
➡️

Dirección de Filtro

¿Cómo fluyen los filtros?

En una relación 1:N, los filtros fluyen del lado "uno" (dimensión) hacia el lado "muchos" (hechos). Esto es el comportamiento predeterminado y correcto: cuando seleccionas un cliente en un slicer, el filtro viaja desde DimCliente hasta FactVentas.

// Ejemplo de flujo de filtro
DimCliente [IDCliente=42] ──► FactVentas [IDCliente=42]
                               // Solo se ven las ventas del cliente 42

Dirección Única (Single — recomendado)

El filtro va de la dimensión a los hechos. Es la configuración por defecto y la más predecible. Los valores del lado "uno" filtran al lado "muchos".

Dirección Doble (Both — usar con cautela)

El filtro fluye en ambas direcciones. Puede producir resultados inesperados y afectar al rendimiento. Solo úsala cuando sea estrictamente necesario — por ejemplo, en relaciones N:N o en ciertos patrones de seguridad RLS.

↔️

Bidireccionalidad

¿Cuándo usar relaciones bidireccionales?

La bidireccionalidad permite que los filtros viajen en ambos sentidos, pero tiene consecuencias importantes que debes entender antes de activarla.

Cuándo SÍ tiene sentido:

  • Relaciones N:N (muchos a muchos) que necesitan contexto de filtro bidireccional
  • Escenarios de RLS dinámico donde una tabla de seguridad filtra varias tablas
  • Ciertos patrones de bridge tables (tablas puente)

Riesgos de la bidireccionalidad:

  • Ambigüedad: Los filtros pueden propagarse por caminos inesperados en modelos complejos
  • Rendimiento: El motor evalúa más rutas de filtro en cada consulta
  • Resultados incorrectos: Especialmente en cálculos con CALCULATE y contextos de filtro
⚠️ Ojo con esto: La bidireccionalidad automática es una de las causas más frecuentes de errores silenciosos en Power BI. Siempre pregúntate: "¿Por qué necesito esta bidireccionalidad? ¿Puedo resolverlo de otra manera?"
💡

Relaciones Activas e Inactivas

¿Qué diferencia una relación activa de una inactiva?

Entre dos tablas solo puede haber una relación activa (representada con línea sólida en el diagrama). Las relaciones adicionales quedan inactivas (línea discontinua) y no se usan automáticamente.

Caso de uso clásico: múltiples fechas en FactVentas

Una tabla de ventas puede tener varias columnas de fecha: FechaPedido, FechaEnvio, FechaEntrega. Solo puedes tener una relación activa con DimFecha — generalmente FechaPedido. Las otras se crean como relaciones inactivas y se activan con USERELATIONSHIP cuando las necesitas.

// Relaciones con DimFecha:
FactVentas[FechaPedido]  ──── DimFecha[Fecha]  (ACTIVA ✅)
FactVentas[FechaEnvio]  - - - DimFecha[Fecha]  (inactiva)
FactVentas[FechaEntrega]- - - DimFecha[Fecha]  (inactiva)

USERELATIONSHIP en DAX

Activar una relación inactiva en una medida

USERELATIONSHIP es la función DAX que te permite usar una relación inactiva dentro del contexto de una medida. Se usa siempre dentro de CALCULATE.

// Medida usando la fecha de pedido (relación activa — comportamiento normal)
Ventas por Fecha Pedido =
SUM(FactVentas[Importe])

// Medida usando la fecha de envío (relación inactiva — activada con USERELATIONSHIP)
Ventas por Fecha Envio =
CALCULATE(
    SUM(FactVentas[Importe]),
    USERELATIONSHIP(FactVentas[FechaEnvio], DimFecha[Fecha])
)

Puntos clave sobre USERELATIONSHIP:

  • Solo funciona dentro de CALCULATE (o funciones que lo llaman internamente)
  • La relación inactiva debe existir en el modelo — no puedes inventarla en DAX
  • Temporalmente "desactiva" la relación activa y "activa" la especificada
  • Muy útil para análisis de inteligencia de tiempo con múltiples dimensiones de fecha
💡 Tip kawaii: El patrón "role-playing dimensions" — una sola tabla DimFecha relacionada varias veces con FactVentas mediante relaciones activas/inactivas — es uno de los más elegantes y eficientes en Power BI. ¡Aprende a dominarlo! 🌸
🚀 ¡Siguiente paso! Ahora que entiendes las relaciones, es el momento perfecto para ver cómo se organizan en el Esquema Estrella. Si necesitas gestionar relaciones complejas de forma dinámica en DAX, revisa las funciones DAX de relaciones.