VISITAS (Un Click es bien recibido)

lunes, 26 de septiembre de 2011

Fases en un proyecto de Business Intelligence

Hace poco en una entrevista de trabajo me preguntaron por el ciclo de desarrollo de un proyecto en B.I., y la verdad es que me lo pensé y mucho y después de mirar por páginas y páginas me doy cuenta de que no hay nada unificado o que cada autor expone sus propias fases. En un curso que nos dieron hace un tiempo encontré un capitulo que hablaba sobre el tema y contenía las siguientes fases:

  1. Requisitos.
  2. Análisis.
  3. Diseño.
    1. Diseño de la Arquitectura técnica.
    2. Diseño de la Arquitectura técnica.
    3. Diseño del modelo dimensional.
    4. Diseño de los proceso de transformación y carga.
    5. Especificaciones de las aplicaciones de análisis e informes.
  4. Desarrollo.
    1. Desarrollo del diseño físico.
    2. Desarrollo del proceso de transformación y carga.
    3. Desarrollo de las aplicaciones de análisis e informes.
  5. Implantación.
    1. Entrega (implantación).
    2. Formación de usuarios.
  6. Mantenimiento.


¿Estaría completa esta "lista de fases" ?

¿Faltarán o sobran? ¿Que engloba cada una de ellas?

Me gustaría poder saber cuales creéis que son las fases y así poder tenerlas claras e intentar definir que es y que engloba cada una de ellas.

Si me ayudáis a definirlas las recopilo y las vamos completando.

Muchas gracia.


  1. Requisitos.

    Esta fase es común a todos los proyectos, ya sean estos de B.I. o un sistema operacional.
    En esta fase se pretende saber que es lo que quiere el cliente.Lo normal es fijar reuniones con los clientes.

    Lo ideal sería reunirse con el cliente que ha requerido el proyecto y que él nos indique -además de sus expectativas- quien o quienes saben o con quien nos tenemos que entrevistar para saber en cada momento que es lo que se espera del sistema, cual es la forma que tienen de trabajar, sus principales indicadores de negocio, mejoras que ellos introducirían, si tienen ya un sistema es interesante saber si opinión sobre el mismo y que es lo que les gusta o no de él, etc... en definitiva una toma de requisitos de todo lo que el sistema deberá realizar, sus funcionalidades, limitaciones, alcance...

    Se pretende fijar los objetivos y alcance del proyecto con lo que el cliente nos pueda contar.


    Siempre hay que intentar escuchar a todos y no excluir a nadie porque un factor de fracaso de un proyecto es que si la gente implicada no esta integrada o no se le ha tomado en cuenta, al final no lo usarán o pondrán todos los reparos inimaginables para no usarlos por no ser participes del mismo. Es fundamental implicar a todos los integrantes o futuros usuarios en el desarrollo del mismo en la medida de lo posible.


  2. Análisis.


    En esta fase se debería estudiar mucho todos los requerimientos del cliente, ver que lo que tenemos claro y lo que no. Para mi es una fase en la cual se profundiza en conocer todo sobre las actividades del negocio de los clientes para tener una visión lo más detallada posible con todo recopilado durante la captación de requisitos.

    Se debe analizar cualquier duda antes de ponerse a diseñar cualquier parte del proyecto, y volverse a reunir con los clientes para profundizar en aquellos temas que sean más importantes. Saber objetivos que se pretende, indicadores claves del negocio.

  3. Es como un refinamiento de todos los requisitos recogidos.

    También es un buen momento para crear equipos de trabajo para cada una de las áreas que se verán implicadas: Bases de datos, programadores, diseñadores de informes, sistemas, etc.

    Un tema importante en los proyectos de B.I. es la definición de los KPI (indicadores claves de rendimiento) que son los parámetros mediante los cuales los clientes miden el rendimientos y objetivos sobre metas planteadas. Pueden ser objetivos financieros o de cualquier otra naturaleza. Son básicamente herramientas:

    • de diagnostico del estado de la empresa u objetivos.
    • de comunicación de resultados, estado de objetivos.
    • de motivación para todos los implicados en el proyecto.
    • de mejora de los procesos de negocio.

    Ejemplos típicos de KPIs:

    • Evolución del valor de stock.
    • Evolución de deudas de una empresa.
    • Evolución del desempeño de empleados.
    • Plazos de entregas.
    • Etc.

viernes, 23 de septiembre de 2011

Jerarquía de Tiempos III (Rellenando las tablas)

Procedimientos para poblar el modelo.


Para poder insertar datos en mi pequeña jerarquía he hecho una serie de procedimientostambién es Mysql, y como no, también admito sugerencias y mejoras porque lashay y muchas. He copiado tal cual los procedimientos unos detrás de otros. Si hayerrores en al nombre de algún campo es agradecería que alguien me lo dijera, así lo voy puliendo hasta que lo pase a Oracle.

----------------------------------------------------------------------------------------------
-- Completa la longitud del dia para que alaplicar el formato siempre quede como YYYYMMDD
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `DiaConCeros`(idDia TINYINT) RETURNSvarchar(2) CHARSET latin1
BEGIN
DECLARE dia VARCHAR(2);
IF (idDia <= 9) THEN
set dia = concat('0',idDia);
ELSE
set dia = concat(idDia);
END IF;
RETURN dia;
END
----------------------------------------------------------------------------------------------
-- Determina si el dia pasado como parámetro caeen fin de semana
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `FinDeSemana`(Descripcion VARCHAR(20))RETURNS tinyint(1)
BEGIN
DECLARE Resultado BOOLEAN DEFAULT FALSE;
IF (UPPER(Descripcion)='SATURDAY' orUPPER(Descripcion)='SUNDAY'
or UPPER(Descripcion)='SABADO' orUPPER(Descripcion)='DOMINGO') THEN
set Resultado =TRUE;
END IF;
RETURN Resultado;
END
----------------------------------------------------------------------------------------------
-- Completa la longitud del mes para que alaplicar el formato siempre quede como YYYYMMDD
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `MesConCeros`(idMes TINYINT) RETURNSvarchar(2) CHARSET latin1
BEGIN
DECLARE mes VARCHAR(2);
IF (idMes <= 9) THEN
set mes = concat('0',idMes);
ELSE
set mes = concat(idMes);
END IF;
RETURN mes;
END
----------------------------------------------------------------------------------------------
-- Traduce el dia del mes por su equivalente enletras
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `NombredelDia`(idDia TINYINT) RETURNSvarchar(12) CHARSET latin1
BEGIN
DECLARE Dia VARCHAR(12);
CASE idDia
WHEN 1 THEN set Dia ='Lunes';
WHEN 2 THEN set Dia ='Martes';
WHEN 3 THEN set Dia ='Miercoles';
WHEN 4 THEN set Dia ='jueves';
WHEN 5 THEN set Dia='Viernes';
WHEN 6 THEN set Dia ='Sabado';
WHEN 7 THEN set Dia ='Domingo';
ENDCASE;
RETURN Dia;
END

----------------------------------------------------------------------------------------------
-- CTraduce el mes por su equivalente en letras
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `NombredelMes`(idMes TINYINT) RETURNSvarchar(12) CHARSET latin1
BEGIN
DECLARE Mes VARCHAR(12);
CASE idMes
WHEN 1 THEN set Mes ='Enero';
WHEN 2 THEN set Mes ='Febrero';
WHEN 3 THEN set Mes ='Marzo';
WHEN 4 THEN set Mes ='Abril';
WHEN 5 THEN set Mes ='Mayo';
WHEN 6 THEN set Mes ='Junio';
WHEN 7 THEN set Mes ='Julio';
WHEN 8 THEN set Mes ='Agosto';
WHEN 9 THEN set Mes ='Septiembre';
WHEN 10 THEN set Mes ='Octubre';
WHEN 11 THEN set Mes ='Noviembre';
WHEN 12 THEN set Mes ='Diciembre'; ENDCASE;
RETURN Mes;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de cuatrimestres a partir deaño pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Cuatrimestre_proc`(IN Anyo SMALLINT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE anyoActual SMALLINT DEFAULT 2011;
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE NCuatrimestre TINYINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idCuatrimestrePrevio SMALLINT DEFAULT 1;
DECLARE idCuatrimestreSiguiente SMALLINT DEFAULT 1;
DELETE from T_Cuatrimestre WHERE idYear=Anyo;
SET NCuatrimestre=1;
REPEAT
SET idCuatrimestre=concat(Anyo,NCuatrimestre);
CASE NCuatrimestre
WHEN 1 THEN
set descripcion= 'PrimerCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo-1,3);
set idCuatrimestreSiguiente=concat(Anyo,2);
WHEN 2 THEN
set descripcion= 'SegundoCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo,1);
set idCuatrimestreSiguiente=concat(Anyo,3);
WHEN 3 THEN
set descripcion= 'TercerCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo,2);
set idCuatrimestreSiguiente=concat(Anyo+1,1);
END CASE;
INSERT INTO`t_cuatrimestre`(idCuatrimestre,Descripcion_Cuatrimestre,idCuatrimestrePrevio,IdCuatrimestreSiguiente,idYear,NCuantrimestre) VALUES (idCuatrimestre,descripcion ,idCuatrimestrePrevio ,idCuatrimestreSiguiente,Anyo,NCuatrimestre);
commit;
SET NCuatrimestre = NCuatrimestre +1;
UNTIL NCuatrimestre > 3 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de dias del año a partir deaño y mes pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Dia_proc`(IN Anyo INT, IN nMes TINYINT)
BEGIN
DECLARE idDia INT DEFAULT 20000101;
DECLARE idMes INT;
DECLARE idMesAux INT;
DECLARE ultimoDia TINYINT;
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE fecha DATE;
DECLARE esFindeSemana BOOLEAN;
DECLARE numSemana TINYINT;
DECLARE diaDelAnyo SMALLINT;
DECLARE descripcion VARCHAR(20);
DECLARE idDiaPrevio INT ;
DECLARE idDiaSiguienteINT ;
DECLARE nDia TINYINT DEFAULT 1;
set idMes = concat(Anyo,MesconCeros(nMes));
set idMesAux = idMes;
DELETE from T_Dia WHERET_Dia.idMes=idMesAux;
REPEAT
SETidDia=concat(Anyo,MesconCeros(nMes),diaConCeros(nDia));
SET fecha=idDia;
SET idDiaSiguiente= cast( DATE_FORMAT(DATE_ADD(date(fecha), INTERVAL 1DAY) ,'%Y%m%d') as char(8));
SET idDiaPrevio= cast( DATE_FORMAT(DATE_ADD(date(fecha), INTERVAL -1DAY) ,'%Y%m%d') as char(8));
SET numSemana=WEEK(fecha,1);
SET diaDelAnyo= DAYOFYEAR(fecha);
SELECT idTrimestre INTO idTrimestrefrom t_mes WHERE t_mes.idMes =idMes ;
SELECT idcuaTrimestre INTOidCuatrimestre from t_mes WHERE t_mes.idMes =idMes ;
-- - Descripcion del dia
SET descripcion = dayName(idDia);
SET EsFindeSemana=FinDeSemana(descripcion);
SET ultimoDia= day(LAST_DAY(concat(idMes,'01')));
INSERT INTO t_dia (idDia,Fecha,Descripcion_dia,IdDiaPrevio,idDiaSiguiente,Festivo,FinSemana,Semana, idMes,DiaDelAnio)VALUES(idDia,fecha,descripcion,idDiaPrevio,idDiaSiguiente,null,EsFindeSemana,numSemana,idMes,diaDelAnyo);
SET nDia = nDia +1 ;
UNTIL nDia> ultimoDia END REPEAT;
END
-- --------------------------------------------------------------------------------------------
-- Rellena la tabla de meses del año a partir deaño
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Mes_proc`(IN Anyo INT)
BEGIN
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idMesPrevio INT DEFAULT 1;
DECLARE idMesSiguiente INT DEFAULT 1;
DECLARE nMes TINYINT DEFAULT 1;
DECLARE idMes INT;
DECLARE dsMes CHAR(2);
DECLARE ultimoDia SMALLINT;

DELETE from T_Mes WHERE idYear=Anyo;
REPEAT
---Para pones el cero delante del mes en caso de meses menores de 9
IF (nMes <= 9) THEN
set idMes = concat(Anyo,'0',nMes);
ELSE
set idMes = concat(Anyo,nMes);
END IF;
SET descripcion = NombredelMes(nMes);
SET ultimoDia=day(LAST_DAY(concat(idMes,'01')));
-- -Mes Previo
---Mes Siguiente
CASE nMes
WHEN 1 then
SET idMesPrevio = concat(Anyo-1,'12');
SET idMesSiguiente =concat(Anyo,Mesconceros(nMes+1));
WHEN 12 THEN
SET idMesPrevio = concat(Anyo+1,'01');
SET idMesSiguiente =concat(Anyo +1,'01');
ELSE
SET idMesPrevio = concat(Anyo,Mesconceros(nMes-1));
SET idMesSiguiente =concat(Anyo ,Mesconceros(nMes+1));
END CASE;
-- -Busco el id del trimestre
CASE
WHEN nMes>=1 and nMes <=3 THEN SET idTrimestre = concat(Anyo, '1');
WHEN nMes>=4 and nMes <=6 THENSET idTrimestre = concat(Anyo, '2');
WHEN nMes>=7 and nMes <=9 THEN SET idTrimestre = concat(Anyo, '3');
WHEN nMes>=10 and nMes <=12 THEN SET idTrimestre = concat(Anyo, '4');
END CASE;
-- - Busco el Id del cuatrimestre
CASE
WHEN nMes>=1 and nMes <=4 THEN SET idCuatrimestre = concat(Anyo, '1');
WHEN nMes>=5 and nMes <=8 THEN SETidCuatrimestre = concat(Anyo, '2');
WHEN nMes>=9 and nMes <=12 THEN SETidCuatrimestre = concat(Anyo, '3');
END CASE;
INSERT INTO T_Mes(idMes,Descripcion_mes,idYear,nMes,NumDiasMes,idMesPrevio,idMesSiguiente,idTrimestre,idCuatrimestre,PrimerDiaMes,UltimoDiaMes)
VALUES ( idMes, descripcion,Anyo ,nMes ,ultimoDia ,idMesPrevio,idMesSiguiente ,idTrimestre ,idCuatrimestre ,1 ,ultimoDia);
call t_dia_proc(Anyo,nMes);
SET nMes = nMes +1 ;
UNTIL nMes> 12 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de trimestres a partir deaño pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Trimestre_proc`(IN Anyo SMALLINT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE anyoActual SMALLINT DEFAULT 2011;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE NTrimestre TINYINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idTrimestrePrevio SMALLINT DEFAULT 1;
DECLARE idTrimestreSiguiente SMALLINT DEFAULT 1;
DELETE from T_Trimestre WHERE idYear=Anyo;
SET NTrimestre=1;
REPEAT
SET idTrimestre=concat(Anyo,NTrimestre);
CASE NTrimestre
WHEN 1 THEN
set descripcion= 'PrimerTrimestre';
setidTrimestrePrevio=concat(Anyo-1,4);
set idTrimestreSiguiente=concat(Anyo,2);
WHEN2 THEN
set descripcion= 'SegundoTrimestre';
set idTrimestrePrevio=concat(Anyo,1);
set idTrimestreSiguiente=concat(Anyo,3);
WHEN 3 THEN
set descripcion= 'TercerTrimestre';
set idTrimestrePrevio=concat(Anyo,2);
set idTrimestreSiguiente=concat(Anyo,4);
WHEN 4 THEN
set descripcion= 'Cuarto Trimestre' ;
set idTrimestrePrevio=concat(Anyo,3);
set idTrimestreSiguiente=concat(Anyo+1,1);
END CASE;
INSERT INTO T_Trimestre(idTrimestre, Descripcion_trimestre, idTrimestrePrevio, IdTrimestreSiguiente,idYear,NTrimestre)
VALUES (idTrimestre,descripcion ,idTrimestrePrevio ,idTrimestreSiguiente ,Anyo,NTrimestre);
commit;
SET NTrimestre = NTrimestre +1;
UNTIL NTrimestre > 4 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de años, se le pasan dosparámetros de año de inicio y fin de fechas a cargar.
----------------------------------------------------------------------------------------------
DELIMITER$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `t_year_proc`(IN AnyoInicio SMALLINT ,INAnyoFin SMALLINT)
BEGIN
DECLARE anyoActual SMALLINT DEFAULT2011;
DECLARE dni VARCHAR(20);
DECLARE unNumero INTEGER;
DECLARE esBisiesto BOOLEAN;
set anyoActual=anyoInicio;
truncate table T_Year;
WHILE anyoActual <= AnyoFin DO
SELECT DATEDIFF(concat(anyoActual,'-12-31'),concat(anyoActual,'-01-01'))+1 into unNumero;
CASE unNumero
WHEN 365 THEN setesBisiesto= false ;
WHEN 366 THEN setesBisiesto= true;
END CASE;
INSERT INTO T_Year (idYear,Num_dias_anyo, Bisiesto, idYearPrevio, idYearSiguiente)
VALUES (anyoActual ,unNumero,esBisiesto ,anyoActual-1 ,anyoActual+1);
call t_Trimestre_proc(anyoActual);
call t_Cuatrimestre_proc(anyoActual);
call t_Mes_proc(anyoActual);
set anyoActual =anyoActual +1;
END WHILE;
END

jueves, 22 de septiembre de 2011

Jerarquía de Tiempos II (Creación de las tablas en Mysql)


Generación de las tablas:
Mi intención es generar este pequeño ejemplo en Oracle, pero tuve un pequeño problema con el servidor así es que lo he generado momentáneamente para Mysql y he usado poco este gestor asi es que he copiado solo la parte de la sentencias que crean las tablas, nada del esquema y demás; cuando lo pase a Oracle estará más completo. Seguramente se pueda hacer mucho mejor, así es que admito todas las sugerencias que me hagáis.
-- -----------------------------------------------------
-- Table `T_Year`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `t_year` (
  `idYear` INT(11) NOT NULL ,
  `Num_dias_Anyo` SMALLINT(6) NULL DEFAULT NULL ,
  `Bisiesto` TINYINT(1) NULL DEFAULT NULL ,
  `idYearPrevio` INT(11) NULL DEFAULT NULL ,
  `idYearSiguiente` INT(11) NULL DEFAULT NULL ,
  PRIMARY KEY (`idYear`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1,
COMMENT = 'Tabla que almacena los años' ;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `T_Trimestre`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `t_trimestre` (
  `idTrimestre` INT(11) NOT NULL ,
  `Descripcion_Trimestre` VARCHAR(45) NOT NULL ,
  `idTrimestrePrevio` INT(11) NULL DEFAULT NULL ,
  `IdTrimestreSiguiente` INT(11) NULL DEFAULT NULL ,
  `idYear` INT(11) NOT NULL ,
  `NTrimestre` TINYINT(4) NOT NULL ,
  PRIMARY KEY (`idTrimestre`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1,
COMMENT = 'Dimension Trimestre' ;

SHOW WARNINGS;
CREATE INDEX `fk_Trimestre_Year` ON `t_trimestre` (`idYear` ASC) ;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `T_Cuatrimestre`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `t_cuatrimestre` (
  `idCuatrimestre` INT(11) NOT NULL ,
  `Descripcion_cuatrimestre` VARCHAR(45) NOT NULL ,
  `idCuatrimestrePrevio` INT(11) NULL DEFAULT NULL ,
  `IdCuatrimestreSiguiente` INT(11) NULL DEFAULT NULL ,
  `idYear` INT(11) NOT NULL ,
  `NCuantrimestre` TINYINT(4) NOT NULL ,
  PRIMARY KEY (`idCuatrimestre`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;

SHOW WARNINGS;
CREATE INDEX `fk_Cuatrimestre_Year` ON `t_cuatrimestre` (`idYear` ASC) ;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `T_Mes`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `t_mes` (
  `idMes` INT(11) NOT NULL ,
  `Descripcion_Mes` VARCHAR(12) NULL DEFAULT NULL ,
  `idYear` INT(11) NULL DEFAULT NULL ,
  `NMes` TINYINT(4) NULL DEFAULT NULL ,
  `NumDiasMes` TINYINT(4) NULL DEFAULT NULL ,
  `idMesPrevio` INT(11) NULL DEFAULT NULL ,
  `idMesSiguiente` INT(11) NULL DEFAULT NULL ,
  `idTrimestre` INT(11) NULL DEFAULT NULL ,
  `idCuatrimestre` INT(11) NULL DEFAULT NULL ,
  `PrimerDiaMes` TINYINT(4) NULL DEFAULT NULL ,
  `UltimoDiaMes` TINYINT(4) NULL DEFAULT NULL ,
  PRIMARY KEY (`idMes`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;

SHOW WARNINGS;
CREATE INDEX `fk_Mes_T_Trimestre1` ON `t_mes` (`idTrimestre` ASC) ;

SHOW WARNINGS;
CREATE INDEX `fk_Mes_T_Cuatrimestre1` ON `t_mes` (`idCuatrimestre` ASC) ;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `T_Dia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `t_dia` (
  `idDia` INT(11) NOT NULL ,
  `Fecha` DATE NULL DEFAULT NULL ,
  `Descripcion_Dia` VARCHAR(45) NULL DEFAULT NULL ,
  `IdDiaPrevio` INT(11) NULL DEFAULT NULL ,
  `idDiaSiguiente` INT(11) NULL DEFAULT NULL ,
  `Festivo` TINYINT(1) NULL DEFAULT NULL ,
  `FinSemana` TINYINT(1) NULL DEFAULT NULL ,
  `Semana` TINYINT(4) NULL DEFAULT NULL ,
  `idMes` INT(11) NULL DEFAULT NULL ,
  `DiaDelAnio` SMALLINT(6) NULL DEFAULT NULL ,
  PRIMARY KEY (`idDia`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
SHOW WARNINGS;
CREATE INDEX `fk_Dia_Mes1` ON `t_dia` (`idMes` ASC) ;
SHOW WARNINGS;

Jerarquía de Tiempos I(modelo de datos simplificado)

Un tema muy importante en esto que se ha dado en llamar Business intelligence es una buena jerarquía de tiempo.
Antes de nada solo decir que una buena jerarquía es fundamental para posteriormente realizar cualquier tipo de informe con cualquier herramienta de reporting. Sin ella es difícil poder analizar cualquier tipo de información desde el tipo de vista temporal, lo cual es imprescindible.
Practicando para no oxidarme estaba haciendo una, y se me ocurrió que a lo mejor lo podía compartir y con sugerencias mejorarla poco a poco.
Como pronto este es el modelo de datos que la representa, por cierto el modelo está realizado con la herramienta “Data Modeling” de MySQL:

La jerarquía es muy sencilla como se puede ver, para describir un poco cada campo con una mínima explicación:
  • Tabla T_Year: Contiene simplemente años con una serie de atributos que nos van a interesar a la hora de poder hacer informes:
    • idYear: año, su formato es YYYY.
    • Num_dias_Anyo: Días del año.
    • Bisiesto: 0=No es bisiesto, 1= si es bisiesto.
    • idYearPrevio: añosprevio.
    • idYearSiguiente: Año siguiente.
  • Tabla T_Trimeste: Como su nombre indica es una agrupación de los años en trimestres. Sus campos son:
    • idTrimestre: Identificación del trimestre: YYYYN
    • Descripcion_Trimestre: Descripción en texto, con valores: Primer Trimestre, Segundo Trimestre, Tercer Trimestre y Cuarto Trimestre.
    • idTrimestrePrevio: Identificación del trimestre previo.
    • IdTrimestreSiguiente: Identificación del trimestre siguiente.
    • idYear: Clave externa a T_Year.
    • NTrimestre: Valores del 1 al 4.
  • Tabla T_Cuatrimeste: Como su nombre indica es una agrupación de los años en cuatrimestres. Los campos que contiene:
    • idCuatrimestre: Identificación del cuatrimestre: YYYYN
    • Descripcion_cuatrimestre: Descripción en texto, con valores: Primer Cuatrimestre, Segundo Cuatrimestre, Tercer Cuatrimestre y Cuarto Cuatrimestre.
    • idCuatrimestrePrevio: Identificación del Cuatrimestre previo.
    • IdCuatrimestreSiguiente: Identificación del Cuatrimestre siguiente.
    • idYear: Clave externa a T_Year.
    • NCuantrimestre: Valores del 1 al 3.
  • Tabla T_Mes: Pues para que muchas explicaciones, contiene fechas en formato YYYYMM.
    • idMes : Identificación del mes.
    • Descripcion_Mes : Descripción del mes: Enero, Febrero…
    • idYear: identificación del Año.
    • NMes: Numero del mes : 1= Enero, 2= Febrero…
    • NumDiasMes : Número de días del mes correspondiente.
    • idMesPrevio: Identificación del mes previo.
    • idMesSiguiente Identificación del mes siguiente.
    • idTrimestre: Identificación del trimestre al que pertenece el mes.
    • idCuatrimestre: Identificación del Cuatrimestre al que pertenece el mes.
    • PrimerDiaMes: Primer día del mes.
    • UltimoDiaMes: Último día del mes.
  • Tabla T_Dia: Esta tabla contiene las fechas en su mayor detalle, los campos que componen la estructura
    • idDia : Identificación del día con formato YYYMMDD
    • Fecha: Otra representación del día en un formato más usual DD-MM-YYYY
    • Descripcion_Dia: Día de la semana: Lunes, Martes…
    • IdDiaPrevio: Identificación del día anterior.
    • idDiaSiguiente: Identificación del día siguiente.
    • Festivo: Indicará si el día es o no festivo.
    • FinSemana: Indica si el día cae en fin de semana.
    • Semana: Semana del año en al que se encuentra el día.
    • idees: Identificación del mes al que pertenece.
    • DiaDelAnio: Día del año.
En la próximas entradas pondré el SQL para generar el esquema por si alguien le quiere, y los procedimientos de carga de las tablas.
Si alguien me quiere sugerir ideas para implementarlo serán muy bien recibidas.