Modelado de relaciones 1-n como relaciones 1-1
Los problemas más habituales que se presentan si las relaciones 1-n se modelan como 1-1 son los siguientes:
- El recuento doble para consultas de granularidad múltiple no se evita automáticamente.
El software IBM Cognos no puede detectar los hechos y después generar una consulta enlazada para compensar el recuento doble, que se puede dar al trabajar con relaciones jerárquicas y diferentes niveles de granularidad en dimensiones compatibles.
- Las consultas de varios hechos no se detectan automáticamente.
El software IBM Cognos no dispondrá de información suficiente para detectar una consulta de varios hechos. Para las consultas de varios hechos, se realiza una unión interna y la unión de bucle se elimina al eliminar la última unión evaluada. Al eliminar una unión es posible que se produzcan resultados incorrectos o impredecibles, en función de las dimensiones y los hechos que se incluyan en la consulta.
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.


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

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