Modelado de relaciones 1-n como relaciones 1-1

Si existe una relación 1-n en los datos pero está modelada como una relación 1-1, no se puede evitar realizar capturas SQL porque la información proporcionada por los metadatos al software IBM® Cognos resulta insuficiente.

Los problemas más habituales que se presentan si las relaciones 1-n se modelan como 1-1 son los siguientes:

Si la cardinalidad se modificara para utilizar sólo relaciones 1-1 entre los asuntos de consulta o las dimensiones, el resultado de una consulta sobre Product Forecast y Sales con Time o Time y Product genera una sentencia única Select que elimina una unión para impedir una referencia circular.

El ejemplo siguiente muestra que los resultados de esta consulta son incorrectos cuando se comparan con los resultados de consultas individuales contra Sales o Product Forecast.

Los resultados de las distintas consultas son los siguientes.

Salida de informe que muestra las columnas Month Name, Product Name y Quantity
Salida de informe que muestra las columnas Month Name, Product Name y Expected Volume

Cuando combina estas consultas en una sola, los resultados son los siguientes.

Salida de informe que muestra las columnas Month Name, Product Name Quantity y Expected Volume

SQL

Como se ha detectado una ruta de unión circular en el modelo, el SQL generado no incluía una de las relaciones que no era necesaria para completar la ruta de unión. En este ejemplo se han eliminado las relaciones entre Time y Product Forecast.

Una ruta de unión circular raramente da lugar a una consulta que genere resultados útiles.

select 
	TIME_.MONTH_NAME as MONTH_NAME,
	PRODUCT_LOOKUP.PRODUCT_NAME as PRODUCT_NAME,
	XSUM(SALES_FACT.QUANTITY for
	TIME_.CURRENT_YEAR, TIME_.QUARTER_KEY, TIME_.MONTH_KEY,
	PRODUCT.PRODUCT_LINE_CODE, PRODUCT.PRODUCT_TYPE_CODE,
	PRODUCT.PRODUCT_KEY ) as QUANTITY,
	XSUM(PRODUCT_FORECAST_FACT.EXPECTED_VOLUME for TIME_.CURRENT_YEAR, 
	TIME_.QUARTER_KEY, TIME_.MONTH_KEY, PRODUCT.PRODUCT_LINE_CODE,
	PRODUCT.PRODUCT_TYPE_CODE, PRODUCT.PRODUCT_KEY ) as EXPECTED_VOLUME
from 
	(select TIME.DAY_KEY,TIME.MONTH_KEY, TIME.QUARTER_KEY,
	TIME.CURRENT_YEAR,TIME.MONTH_EN as MONTH_NAME 
	from TIME_DIMENSION TIME) TIME 
	join 
	SALES_FACT on (TIME_.DAY_KEY = SALES_FACT.ORDER_DAY_KEY) 
	join 
	PRODUCT_FORECAST_FACT on (TIME_.MONTH_KEY = 
	PRODUCT_FORECAST_FACT.MONTH_KEY) 
	join 
	PRODUCT (PRODUCT.PRODUCT_KEY = PRODUCT_FORECAST_FACT.PRODUCT_KEY) 
where 
	(PRODUCT.PRODUCT_NAME in ('Aloe Relief','Course Pro Umbrella'))
and
	(TIME_.MONTH_NAME in ('April 2004','February 2004','February 2006'))
group by 
	TIME_.MONTH_NAME, PRODUCT.PRODUCT_NAME