2010-03-24 12 views
11

Estoy compilando un almacén de datos. Cada hecho tiene su marca de tiempo. Necesito crear informes por día, mes, quilate pero también por horas. Al observar los ejemplos, veo que las fechas tienden a guardarse en tablas de dimensiones. alt starexample http://etl-tools.info/images/dw_star_schema.jpgDimensión de fecha y hora en el almacén de datos

Pero creo que no tiene sentido el tiempo. La tabla de dimensiones crecería y crecería. Por otro lado, JOIN con la tabla de dimensiones de fecha es más eficiente que usar funciones de fecha/hora en SQL.

¿Cuáles son sus opiniones/soluciones?

(estoy usando Infobright)

+1

Los informes por hora parecen una especie de alta resolución para un depósito de datos. ¿Es realmente necesario/apropiado? –

Respuesta

6

Supongo que depende de su requisito de informe. Si necesita necesita algo así como

WHERE "Hour" = 10 

que significa que cada día 10:00:00-10:59:59, entonces yo uso la dimensión del tiempo, ya que es más rápido que

WHERE date_part('hour', TimeStamp) = 10 

porque la función date_part() se evaluará para cada fila. Aún debe mantener la marca de hora en la tabla de hechos con el fin de agregar sobre los límites de días, como en:

WHERE TimeStamp between '2010-03-22 23:30' and '2010-03-23 11:15' 

que se pone incómodo al usar campos de dimensión.

Por lo general, la dimensión de tiempo tiene una resolución de minutos, por lo que 1440 filas.

+0

Para ser claros, está recomendando dos dimensiones separadas, una de días (365 * 10 = 3,650 registros) y una de minutos (1,440 registros)? Me gustaría entender la ventaja de dividirlo; una sola dimensión 'DateTime' sería más grande (365 * 10 * 24 = 87,600 registros en un grano por hora) pero aún no es grande, y haría los cálculos de zonas horarias mucho más fáciles. –

+0

@JonofAllTrades dividiéndolo cada dimensión tiene una PK sensible. Algunos hechos van a estar en la granularidad de la fecha (es decir, sin una marca de tiempo), y algunos van a estar en el momento de la granularidad. Al unir una tabla de hechos en la granularidad de la fecha a la dimensión en el momento, la granularidad generará duplicados a los que luego deberá recurrir para eliminar más recursos. – jackohug

+0

@jackohug: Claro, por eso siempre tengo una tabla 'Fechas' y una tabla' Tiempos'. Pero cuando * do * tiene valores de fecha y hora, ¿por qué usar dos teclas y una combinación doble en lugar de un solo FK de cuatro bytes en una tabla 'DateTimes'? Me funcionó bien, pero algunas personas parecen ser alérgicas a eso, sin una razón bien explicada. –

3

tiempo debe ser una dimensión de almacenes de datos, ya que con frecuencia tendrá que agregar al respecto. Puede usar el snowflake-Schema para reducir la sobrecarga. En general, como señalé en mi comentario, las horas parecen una resolución inusualmente alta. Si insistes en ellos, hacer que la hora del día sea una dimensión separada podría ayudar, pero no puedo decirte si esto es un buen diseño.

+1

Si la fecha es una dimensión de 10 años, solo tiene unos 3650 registros. Los informes hora a hora son muy útiles aquí. Tenemos que comparar los días: de lunes a lunes, de martes a martes y de lunes a viernes de 11: 00-12: 00 a martes de 11: 00-12: 00. ¿Crees que el copo de nieve es más útil/eficiente que la estrella? –

+0

Snowflake puede ayudar a reducir la redundancia en las tablas de dimensiones, pero si eso te ayuda a mejorar el rendimiento o la memoria en tu caso particular, no puedo decirlo. –

+0

Una dimensión de fecha con 10 años y horas sigue siendo pequeña: 87.660 filas. Además, puede resumir datos antiguos para reducir la resolución de tiempo. Después de 10 años, ¿qué relevancia tienen realmente las 10AM del jueves? –

26

Kimball recomienda tener tiempo- y fecha separadas dimensiones:

design-tip-51-latest-thinking-on-time-dimension-tables

En los libros anteriores del juego de herramientas, tenemos recomienda la construcción de una dimensión tan con el componente de minutos o segundos de tiempo como una Offset desde la medianoche de cada día, pero nos hemos dado cuenta de que las aplicaciones del usuario final resultaban demasiado difíciles, especialmente wh es tratar de calcular el tiempo tramos. Además, a diferencia de la dimensión del día calendario , hay muy pocos atributos descriptivos de para el minuto o segundo específico dentro de un día . Si la empresa tiene bien atributos definidos por intervalos de tiempo dentro de un día, como los nombres de turno, o ranuras de tiempo de publicidad, un dimensión adicional de hora del día se puede añadir a el diseño en el que esta dimensión es define como la cantidad de minutos (o incluso segundos) pasada la medianoche. Por lo tanto, esta dimensión del tiempo tendría 1440 registros si el grano fuera minutos o 86,400 registros si el grano fuera segundos.

+3

+1 para citar a alguien inteligente. –

+0

De acuerdo, esta es una buena solución. –

+2

El enlace al sitio de Kimball ahora está muerto. Aquí hay un nuevo [enlace] válido (http://www.kimballgroup.com/html/designtipsPDF/DesignTips2004/KimballDT51LatestThinking.pdf). – user327961

3

Recomendaría tener una dimensión separada para la fecha y la hora. La dimensión de fecha tendría 1 registro para cada fecha como parte del rango válido de fechas identificadas. Por ejemplo: 01/01/1980 a 12/31/2025.

Y una dimensión separada para el tiempo que tiene 86400 registros con cada segundo que tiene un registro identificado por la tecla de tiempo.

En los registros de hechos, donde necesita la fecha y la hora, agregue ambas claves que tengan referencias a estas dimensiones conformadas.