Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
JavierBlanco
Contributor III
Contributor III

A vueltas con las claves sintéticas

Hola a todos:

Estoy creando un modelo de datos a partir de una serie de tablas que me proporciona el cliente; si hago una carga de datos "a pelo", el modelo que a Qlik Sense buenamente se le ocurre es el siguiente:

Completado con errores y/o advertencias
0 error(es) forzado(s)
8 clave(s) sintética(s)

$Syn 1 = ID_MES+FCH_ACTO_COMERCIAL
$Syn 2 = ID_SFID+ID_MES
$Syn 3 = ID_SFID+ID_MES+LINEA_NEGOCIO_NMR
$Syn 4 = ID_SFID+ID_MES+FCH_ACTO_COMERCIAL

$Syn 5 = $Syn 2+$Syn 3
$Syn 6 = $Syn 1+$Syn 2+$Syn 4
$Syn 7 = $Syn 1+$Syn 2+$Syn 3+$Syn 4
$Syn 8 = $Syn 5+$Syn 6+$Syn 7

Captura.PNG

Bien, la pregunta es ¿cómo de malo sería dejar así el modelo? Según la ayuda oficial:

La presencia de varias claves sintéticas suelen ser un síntoma de un modelo de datos incorrecto, pero no siempre. Sin embargo, un signo inequívoco de que el modelo de datos es incorrecto es la presencia de claves sintéticas basadas en otras claves sintéticas.

Por lo que estoy leyendo, aquí y aquí, que Qlik cree claves sintéticas no es malo per se en términos de rendimiento e incluso asegura que el tratamiento de los valores nulos sea correcto; sin embargo, en este caso llega a crear claves sintéticas a partir de claves sintéticas, que según la ayuda es signo inequívoco de que el modelo de datos es incorrecto.

Por otro lado, hay algunos problemas de redundancia en las tablas, en especial con las fechas, puesto que ID_MES está incluido en FCH_ACTO_COMERCIAL (una tabla incluso incluye un campo ID_ANIO, aunque por suerte no aparece en ninguna otra y no afecta a las conexiones), tal que así:

ID_MESFCH_ACTO_COMERCIAL
20191220191201

 

¿Sería estrictamente necesario omitir la carga de ID_MES en aquellas tablas que también incluyen FCH_ACTO_COMERCIAL (algunas tablas sólo incluyen ID_MES como referencia temporal, eso sí)? ¿Mejoraría el rendimiento o la solidez del modelo de datos? Porque se me ocurre que complicaría las presentaciones por mes de esos datos, ¿no? ¿Habría que procesar FCH_ACTO_COMERCIAL a posterior para extraer el mes?

Bien, como solución al problema de las claves sintéticas se me ha ocurrido crear las dos siguientes:

Hash256(ID_SFID, FCH_ACTO_COMERCIAL) as $key1
Hash256(ID_MES, ID_SFID, LINEA_NEGOCIO_NMR) as $key2

La primera podría incluir ID_MES o no.

De manera que el modelo queda:

Completado con éxito
0 error(es) forzado(s)
0 clave(s) sintética(s)

Captura2.PNG

 

¿Hay algún problema en incluir FCH_ACTO_COMERCIAL en una de mis claves y a la vez usarla como clave en sí para conectar con TABLA_FCH_DIA? ¿El incluir un campo en una de las claves -haciéndolo desaparecer como tal al tener que comentarlo- impide a posteriori utilizarlo en las presentaciones? ¿Se os ocurre una alternativa mejor?

Un saludo y gracias por vuestras aportaciones.

11 Replies
rubenmarin

Hola Javier, en principio parece un modelo que puede funcionar, haría pruebas con algunas selecciones para confirmar que devuelve lo que se espera: seleccionar en cada campo y comprobar que efectivamente filtra los relacionados en otras tablas.

Para simplificar el modelo se podría buscar agrupar algunas tablas de hechos en una única tabla, usando 'Concatenate' y un campo adicional para identificara el TipoRegistro o Tabla a la que pertenece el dato. Se podrían renombrar algunos campos para reducir el número de estos. Por ejemplo si una tabla tiene el campo ImporteCoste y otro ImporteVenta se podría llamar solo Importe, y el TipoRegistro indicará que tipo de importe es; esto es solo por rendimiento, si funciona bien con los diferentes campos no sería necesario y el propio nombre de campo ya te indica qué es lo que cuenta.

Esta tabla central de Hechos tendría los campos claves y las medidas (valores a sumar, sacar medias...), de esta tabla podrían salir el resto de tablas con las dimensiones (campos a usar como dimensión o selectores).

La idea es buscar un modelo en estrella, que suele funcionar muy bien y simplifica la ampliación del cuadro, tal como lo tiene si te piden añadir nuevas tablas se te va a ir complicando ver como encajarlas.

Saludos.

 

JavierBlanco
Contributor III
Contributor III
Author

Hola, Rubén:

Muchas gracias por tu respuesta. Al final lo he dejado en un modelo de estrella como sugerías, porque el del primer mensaje daba problemas con algunas métricas (no era capaz de relacionar bien elementos de la TABLA_TRAFICO con otros de la TABLA_SFID, que son categorías fundamentales para hacer agrupaciones):

Captura.PNG

Un saludo a todos.

JavierBlanco
Contributor III
Contributor III
Author

Por cierto, creo que este modelo me está dando precisamente uno de los problemas que se mencionan en el segundo de los artículos que enlacé al abrir el hilo:

And they [nota mía: se refiere a las claves sintéticas] treat NULLs correctly, as opposed to an explicit concatenated key.

Por ejemplo, al intentar definir la siguiente tabla aparecen 85 valores "perdidos":

1.png

Si hacemos lo mismo con un modelo muy sencillo que sólo incluya TABLA_NPS, que es donde se encuentra esa información:

2.png

Esto supongo que es debido a algún problema con %key2 (ID_SFID, FCH_ACTO_COMERCIAL), que de alguna manera no se asocia a esos 85 valores; entonces, ¿la única alternativa es prescindir de mis claves y dejar que Qlik enlace las tablas automáticamente?

Un saludo y gracias por adelantado.

rubenmarin

Esos nulos te indican que hay 85 registros que no tienen asociación con un ID_MES, habría que seguir la traza de los datos para ver donde se está cortando y qué es lo que le falta para llegar, seguramente alguna clave intermedia que no está creada pero es difícil adivinarlo sin poder revisar los datos.

Prueba añadiendo cuadros de tabla para tratar de seguir las relaciones de alguno de esos 85 registros, solucionando 1 puede que se arregle también el resto.

Por otra parte una cosa es dejar una clave sintética que asocie tablas directamente por más de 1 campo y otra tener un modelo donde haya claves sintéticas que se creen usando otras claves sintéticas, el primero seguramente funcionará igual pero del segundo no me fiaría (aunque puede que también funcione).

Yo prefiero no dejar claves sintéticas. si Qlik puede hacer las asociaciones para no dejar nulos siempre hay una opción para replicarlo y no dejar nulos, puede que necesite algo de trabajo extra pero prefiero mantener el control de como se crean las asociaciones.

Saludos.

JavierBlanco
Contributor III
Contributor III
Author

Hola, Rubén, gracias por tu respuesta.

TABLA_NPS por sí sola parece funcionar, con lo cual el problema supongo que se da al conectarla a través de %key2 -que, a diferencia de lo que dice el 1er mensaje, finalmente es Hash256(ID_SFID, FCH_ACTO_COMERCIAL)- con el resto del modelo; no sé si el que la clave no incluya ID_MES es el problema, porque al intentar hacer la tabla con FCH_ACTO_COMERCIAL también aparecen esos 85 valores "perdidos":

Captura.PNG

 

rubenmarin

Hola Javier, en la captura no se ve donde está en ID_MES.

Puedes crear una tabla simple solo con dimensiones para ver las relaciones entre los valores, añadiendo FCH_ACTO_COMERCIAL, ID_MES y cualquier otro campo que te ayude a identificar los registros y así confirmar que todos los FCH_ACTO_COMERCIAL tienen su correspondencia con ID_MES.

JavierBlanco
Contributor III
Contributor III
Author

Bien, he modificado los campos que permiten crear mis claves %key1 y %key2 en TABLA_NPS:

ID_SFID as ID_SFID_NPS,
ID_MES as ID_MES_NPS,
FCH_ACTO_COMERCIAL as FCH_ACTO_COMERCIAL_NPS,

Y he creado un par de tablas para hacer comprobaciones:

Captura1.PNG

La segunda más detallada:

Captura2.PNG

Este caso es el más destacable de los "perdidos", con 16 valores.

Captura3.PNG

Pero hay más, como se puede ver aquí.

rubenmarin

Hola Javier, se ve que hay varios registros con ID_SFID_NPS que no tienen ID_SFID. En la tabla central Key2 debería tener informado ID_SFID en la misma línea, cada ID_SFID_NPS debe tener su ID_SFID para que se propaguen las relaciones. Lo mismo con FCH_ACTO_COMERCIAL.

Por otra parte FCH_ACTO_COMERCIAL  y FCH_ACTO_COMERCIAL_NPS tienen formatos distintos, si FCH_ACTO_COMERCIAL_NPS lo está cargando como número (no es una fecha con formato YYYYMMDD) no va a relacionar una fecha con otra.

Aun siendo ambos fecha probaría a hacer la relación con campos que tengan el mismo formato y usar otro campo si hay que representarlo con un formato distinto para el usuario, aunque primero me preocuparía de que la relaciones sean correctas antes de pasar a la presentación de los datos.

Saludos.

JavierBlanco
Contributor III
Contributor III
Author

Hola, Rubén, muchas gracias por tu pronta respuesta.


@rubenmarin wrote:

En la tabla central Key2 debería tener informado ID_SFID en la misma línea, cada ID_SFID_NPS debe tener su ID_SFID para que se propaguen las relaciones. Lo mismo con FCH_ACTO_COMERCIAL.

No entiendo muy bien este punto, ¿te refieres a eliminar ID_SFID y FCH_ACTO_COMERCIAL como claves independientes?

@rubenmarin wrote:

Por otra parte FCH_ACTO_COMERCIAL  y FCH_ACTO_COMERCIAL_NPS tienen formatos distintos, si FCH_ACTO_COMERCIAL_NPS lo está cargando como número (no es una fecha con formato YYYYMMDD) no va a relacionar una fecha con otra.


Si, FCH_ACTO_COMERCIAL  lo transformé en el script para que tuviera un formato más legible y para que Qlik supiera que, efectivamente, es una fecha.

En cualquier caso, en el resto de valores sí es capaz de relacionar ambas fechas aunque tengan distinto formato:

Captura2.PNG

Un cordial saludo.