Hola a tod@s!
Como seguramente la mayoría sabe, las relaciones son un elemento clave en cualquier modelo de datos (y por tanto también en los modelos utilizados para PowerBI). Las relaciones se encargan de unir 2 tablas a través de un campo común existente en ellas y permiten además que se propaguen de forma automática los filtros en los cálculos DAX.
Según las condiciones en las que estas relaciones se creen las podremos clasificar de 2 formas: relaciones ordinarias y relaciones límitadas (o anteriormente denominadas relaciones débiles).
En esta ocasión por eso, me gustaría hablaros de uno de esos tipos de relaciones que existe en PowerBI, las relaciones limitadas.
¿Cuándo se produce una relación limitada?
Una relación limitada se produce en los siguientes 3 casos:
- Cuando se establece una relación de cardinalidad Varios a Varios entre 2 tablas
- Cuando se establece una relación entre 2 tablas que pertenecen a grupos de origen (también llamados islas) distintos. Hablaremos de grupos de orígenes distintos cuando por ejemplo tengamos tablas en modo IMPORT y tablas en modo DIRECT QUERY
- Cuando una relación es de 1 a N pero la dirección de filtrado es BIDIRECCIONAL, cuando el filtro va de 1 a N es ordinaria, pero cuando el filtro va de N a 1 es limitado (Aunque visualmente no lo identificaremos en la vista del modelo de datos).
Cuando PowerBI considera que una relación es limitada, su representación aparecerá en el modelo con una pequeña discontinuidad en los extremos de la línea que une las tablas, tal y como muestra la siguiente imagen.
Otro ejemplo de relación limitada podría ser la imagen siguiente, en este caso será una relación limitada establecida a causa de conectar 2 tablas de grupos de origen (islas) distintas.

Relación limitada entre islas (modo Direct Query para la tabla Ventas y modo Import para la tabla Producto)
¿Qué implica que una relación sea limitada?
Lo primero que debemos saber es que cuando se establece una relación de tipo ordinario, el motor Vertipaq va a crear una tabla FISICA en memoria con una especie de índice dónde se registra para cada fila de la tabla con valores únicos(1) las filas tiene asociadas de la tabla con valores repetidos (N). Esta tabla como hemos dicho se crea físicamente en memoria, ocupa cierto espacio y es visible utilizando una herramienta como DAX Studio sobre nuestro modelo.
Esto, aunque ciertamente tiene una pequeña penalización a nivel de espacio consumido, nos aporta muchísima potencia y velocidad de análisis ya que al tener la relación indexada en memoria RAM, la velocidad de procesamiento es muy rápida.
En el caso de las relaciones limitadas NO SE CREA ninguna tabla previa indexando los valores de la relación. Esto provoca que cuando tenemos que buscar los elementos relacionados entre 2 tablas, la búsqueda se hace de forma «manual» por parte del motor, creando una espacie de JOIN entre las tablas. Evidentemente, si se trata de tablas muy pequeñas con cardinalidad baja (pocos elementos) el motor tiene capacidad para resolver el problema en tiempos razonables, pero cuando las tablas que forman parte de la relación limitada son tablas de alta cardinalidad, el motor sufre mucho en procesar la información y el informe se vuelve muy lento.
Otro problema que debemos considerar cuando tenemos una relación limitada es que deberemos asegurarnos en capas previas de preparación de datos de controlar perfectamente la integridad referencial.
Hablamos de que hay integridad referencial entre 2 tablas cuando todos los valores de la columna relacionada de la tabla VARIOS tienen un elemento relacionado con la columna de valores de la tabla 1. Esto se muestra mucho más fácil con un ejemplo.
En la imagen que mostramos a continuación, tenemos 2 tablas, DIMCLIENTES y FACTVENTAS y hemos resaltado en rojo un error de integridad referencial donde tenemos una VENTA imputada a un IDCLIENTE( el número 6) que NO EXISTE en la tabla DIMCLIENTES.
En este primer ejemplo, las tablas están en una misma isla (modo Import) por tanto, la relación entre ambas tablas es de tipo ordinario. Si la relación es ordinaria, existe control sobre la integridad referencial de los datos, provocando que aparezca en la representación de los datos una fila en blanco que se asocia a los valores de la tabla ventas que NO tienen su par en la tabla de clientes.
Ahora, vamos a repetir la misma operación, pero en este caso, la tabla DIMCLIENTES la vamos a ir a buscar a un servidor SQLServer en modo DIRECTQUERY, lo que va a provocar que las tablas relacionadas estén en islas separadas y se genere entre ellas una relación limitada.
Como hemos comentado anteriormente, las relaciones limitadas NO gestionan la integridad referencial, lo que va a provocar que si realizamos la misma tabla mostrando el total de ventas por cliente, NO aparezca la fila en blanco que intenta «recuperar» la integridad referencial y además, el total de ventas NO COINCIDA con la suma de ventas de los clientes visibles.
CONCLUSIONES
Siempre que sea posible vamos a intentar que todas las relaciones de nuestro modelo sean ordinarias.
En los casos en los que tengamos que optar por relaciones limitadas, debemos intentar que la cardinalidad de las columnas que forman la relación sea lo más pequeña posible para no afectar al rendimiento de nuestro informe.
Recordar siempre que cuando utilicemos relaciones limitadas, deberemos controlar en fases previas de control de datos la integridad referencial de las tablas para no tener problemas con datos incorrectos.
Espero que el post os haya sido de utilidad y nos leemos en el próximo!
#SigueElCaminoDeLaEstrella
Comentarios recientes