martes, 26 de noviembre de 2013

ANÁLISIS DE RESULTADOS Y RESUMEN

Este tercer proyecto del curso de Bases de Datos I del Instituto Tecnológico de Costa Rica, consiste en la implementacion de un sistema de base de datos para un Periódico Digital, el cual se tiene que realizar en Microsoft SQL Server. 

El presente Proyecto se implemento según lo visto y aprendido en clases, ademas de la investigación por aparte de los lenguajes y programas utilizados en la elaboración del mismo. 

Este Proyecto nos ayudo a crecer como estudiantes ya que aprendimos mas herramientas que ofrece el Microsoft SQL Server que no conocíamos y tuvimos varios problemas en la realización del mismo durante el tiempo en que se realizó la tarea. Muchos errores que desconocíamos completamente nos quitaron tiempo ya que en varias ocasiones se debieron invertir varias horas en la búsqueda de su solución, pero en base a esto aprendimos cosas que no tenían que ver con el proyecto.

En el proyecto se realizo:
- El diagrama de la base de datos 
- La creación de todas las tablas en SQL Server
- La migración de datos de una base de datos no normalizada a la base de datos original
- La consulta de insertar una calificación y actualizar los promedios a una noticia
- La consulta de registrar los correos enviados

A = Tarea cumplida, B = Tarea implementada parcialmente, pues tiene casos en los que falla, C = Tarea implementada solo en la lógica (no se realizó su aplicación correcta), D = Tarea no implementada

Tarea
Cumplimiento
 Implementar la base de datos, mediante un script que creara la bd sobre una instalación inicialmente limpia.
A
Scripts de migración y llenado de datos
A
Procedimientos almacenado que realiza:
 Listado de ultimas noticias, ya sea por tema, o de interés general (en la portada), de la más reciente a la más antigua, hay un máximo de noticias, que es establecido como un parámetro del sistema. 
A
Procedimientos almacenado que: Inserta los cambios cuando un email se envio.
A


Horas Totales:  29 Horas y 50 Minutos



En esta consulta se realiza un listado de las ultimas noticias, ya sea por tema o de interés general, ordenado de la mas antigua a la mas reciente. Se recibe un parametro que será la cantidad de noticias que se quiere ver, ademas de los parámetros Id del tema y de manera opcional según el enunciado de la tarea, el nombre del Subtema si se deseara buscar por Tema y Subtema, sino solo se buscaría solo por el Tema siendo este el modo de Buscar de manera General.

Entre los principales componentes de la consulta estan:

Declaración de variables y Variables Tabla:

DECLARE @EdicionesAux TABLE (Id int IDENTITY(1,1), Nombre varchar(100), FechaDesde date, FechaHasta date)

-- Variable tabla con los datos de los Subtemas --
DECLARE @SubTemasNoticias TABLE (Id int IDENTITY(1,1),Tema int, Nombre varchar(100), IdSubtema int)
-- Tiene el Id y contenido de las noticas, despues de filtrarlas por subtema
DECLARE @NoticiasAux TABLE (Id int IDENTITY(1,1), Contenido text, IdNoticia int, Subtema int, Edicion int)
-- Ediciones y sus fechas
DECLARE @EdicionesAux TABLE (Id int IDENTITY(1,1), Nombre varchar(100), FechaDesde date, FechaHasta date)

Llenado de variable tabla:
Insert into @NoticiasAux(Contenido, IdNoticia, Subtema, Edicion)
Select  N.Contenido, N.Id as IdNoticia, N.FKSubTema as NumSubtema, NPE.FKEdicion
from Noticia N, @SubTemasNoticias STN, NoticiaPorEdicion NPE
Where STN.IdSubtema = N.FKSubTema

AND NPE.FKNoticia = N.Id

Obtener informacion de las Variable Tabla:
Select top (@cantidad) N.Contenido,N.IdNoticia, N.Edicion, E.FechaDesde, E.FechaHasta
from @NoticiasAux N, @EdicionesAux E
where N.Edicion = E.Id
Order By E.FechaDesde



Fecha: 26/11/2013
Hora Inicio: 1:30 pm
Hora Finalizada: 4:00 pm
Tiempo Laborado:  2 horas y 30 minutos

Insercion de Promedios Terminado

Con los cálculos realizados en el primer avance, lo que falta es calcular el promedio nuevo e insertar los datos en la base de datos, a continuación presentamos el código que realizado lo antes dicho

SET @PromedioNuevo =  ((@PromedioActual*@NumCalificaciones) + @Calificacion) / (@NumCalificaciones + 1)

-- Inserta en la tabla Calificacion
BEGIN TRANSACTION

INSERT INTO Calificacion
(FKTipoCalificacion, FKUsuario,FKNoticia)
SELECT @Calificacion,@IdUsuario,@IdNoticia

UPDATE Noticia
SET CalifPromedio = @PromedioNuevo
WHERE Id = @IdNoticia

COMMIT TRANSACTION

print 'Calificacion de una Noticia: '
print ''
   print 'Usuario: ' + @Usuario
print 'Noticia: ' + @Noticia
print 'NumCalificacion: ' +  CAST( @NumCalificaciones as varchar(5) )
print 'Promedio Actual: ' + CAST( round(@PromedioActual,2,1) as varchar(5) )
print 'Promedio Nuevo: ' + CAST( round(@PromedioNuevo,2,1) as varchar(5) )


Fecha: 26/11/2013
Hora Inicio: 9:30 am
Hora Finalizada: 11:10 am
Tiempo Laborado:  1hora y 40 minutos

ERROR: Desbordamiento aritmético para el tipo varchar

El día 26 de noviembre al estar trabajando con la consulta del promedio de las calificaciones, tuvimos un error que el SQL lo menciaba como ´Desbordamiento aritmético para el tipo varchar´.
El error se nos presenta cuando queremos mostrar los resultados del calculo en consola, para corregir este error se tuvo que redondear las cantidades decimales que nos daba en dos decimales y esto lo logramos con la funcion de redonde de SQL, de la siguente manera: 

round(@PromedioActual,2,1)

Y asi pudimos obtener el numero con dos decimales y asi no lograr el desbordamiento aritmetico que se daba antes

Fuentes Consultadas
http://technet.microsoft.com/es-es/library/ms163363(v=sql.105).aspx
http://support.microsoft.com/kb/87797/es

Fecha: 26/11/2013
Hora Inicio: 9:00 am
Hora Finalizada: 9:30 am
Tiempo Laborado:  30 minutos

AVANCE: Store Procedure: Insercion de Promedios

Se realiza el primer avance del store procedure de los promedios, lo que se hace en este analizar y pensar en la respuesta, así como declarar el procedimiento y las variables que se ocupan, y también se le asignaron a los siguientes variables, valores que se ocuparan después para realizar cálculos o bien para insertar en una variable

-- Id del usuario
SET @IdUsuario = (
SELECT U.Id
FROM Usuario U
WHERE U.Nombre = @Usuario)

-- Id de la noticia
SET @IdNoticia = (
SELECT N.Id 
FROM Noticia N
WHERE N.Titulo = @Noticia)

-- Numero de Calificaciones de la noticia
SET @NumCalificaciones = (
SELECT count(*) 
FROM Calificacion C
WHERE C.FKNoticia = @IdNoticia)

-- Promedio Actual
SET @PromedioActual = (
SELECT N.CalifPromedio
FROM Noticia N

WHERE N.Id = @IdNoticia)

Fecha: 26/11/2013
Hora Inicio: 7:00 am
Hora Finalizada: 8:20 am
Tiempo Laborado:  1hora y 20 minutos

Migracion Terminada

Para finalizar la migración lo que nos hacia falta era trasladar la información de las tablas variables, a las tablas de la base de datos real, por lo cual se realiza toda la inserción en todas las tablas usando el INSERT TO, como por ejemplo:

--Inserta en la tabla NoticiaPorEdicion
INSERT INTO [PeriodicoDigital].dbo.NoticiaPorEdicion
(FKNoticia,FKEdicion)
SELECT NPE.Noticia, NPE.Edicion FROM @NOTICIASPOREDICION NPE

Otra cosa que nos faltaba era crear la migración pero en un procedimiento, y no en muchas consultas como se ha venido realizando por lo cual se declara el store procedure migración, donde se controlan las excepciones con el try y el catch, y un aspecto muy importante es donde poner el begin transaction y el commit transaction, cosa que se hace cuando se esta insertando en la base de datos original solamente. 

Fecha: 26/11/2013
Hora Inicio: 3:00 am
Hora Finalizada: 5:10 am
Tiempo Laborado:  2hora y 10 minutos


Avance Migracion III

Se terminan de hacer las tablas variables que faltaban en la migración, se realizaron las siguientes tablas:

- DECLARE @NOTICIASPOREDICION TABLE (Id INT IDENTITY(1,1), Noticia INT, Edicion INT)

- DECLARE @PORTADA TABLE (Id INT IDENTITY(1,1), Edicion INT)

- DECLARE @TEMAELEGIDO TABLE (Id INT IDENTITY(1,1), Usuario INT, Tema INT)

- DECLARE @SUBTEMAELEGIDO TABLE (Id INT IDENTITY(1,1), Usuario INT, SubTema INT)

- DECLARE @NOTICIASPORTADA TABLE (Id INT IDENTITY(1,1),Portada INT, NoticiasEdicion INT)

Fecha: 26/11/2013
Hora Inicio: 1:00 am
Hora Finalizada: 2:10 am
Tiempo Laborado:  1hora y 10 minutos

lunes, 25 de noviembre de 2013

Error... 

Se estaba definiendo la variable tabla como se define una tabla temporal y se creaba el siguiente error,  pues la tabla temporal se crea y se guarda en la base de datos mientras la variable tabla se utiliza temporalmente y no se almacena solo esta en memoria.

Se estaba haciendo de la siguiente manera, ejemplo:


  • CREATE TABLE #NombreTabla  (Col1 int, Col2 int)


Y lo correcto seria para obtener una variable tabla:


  • DECLARE @NombreTabla TABLE (Col1 int, Col2 int)


"Msg 2714, Level 16, State 6, Line 1
There is already an object named '#tmp' in the database."


Fecha: 22/11/2013
Hora Inicio: 8:00 am
Hora Finalizada:  8:30 am
Tiempo Laborado:   30 minutos

A todos los grupos se les envió la siguiente información, para que se ubicaran mejor con los datos de prueba realizados por nuestro grupo:

En un documento .txt:

Datos de Prueba 3Progra

- Las calificaciones y comentarios son hechos por usuarios

Hoja1
- Las ediciones tienen una fecha de inicio y una fecha de fin que es como el periodo de validez de la edicion
- Las noticias pueden aparecer en varias ediciones
- Cada edicion posee una portada
- N/A - No hay /No existe  -- comentario / UsuarioQueComento
- La columna NombrePeridodico no es necesario representarla en la base de datos se puede suponer solo un periodico
- Los datos de CantidadVisitada se refiere a la cantidad de clicks, cantidadEnviadasCorreo
- La calificacion promedio se puede agarrar de esta hoja o bien sacar el promedio con las calificaciones que vienen en la hoja2


Hoja2
- Si el usuario posee temaElegido y SUbtemaElegido diferente a N/A, esta registrado a ese
 tema y/o subtema para el envio de correos electrónicos



David Vargas
Cristian Araya

Fecha: 23/11/2013
Hora Inicio: 9:00 pm
Hora Finalizada:  9:20 pm
Tiempo Laborado:  20 minutos

Datos Prueba V3.0


Para esta versión se terminaron de agregar noticias, con comentarios, las ediciones y sus fechas y en la Hoja2 se registraron mas usuarios con sus respectivos datos, todo esto en base a las correcciones que el profesor sugirió para el modelo.
Las noticias se tomaron del sitio ya antes mencionado, de ahí se obtienen el Titulo, Contenido y comentarios de las noticias.

Las tablas quedaron de la siguiente manera:

Datos de la Hoja 1:



Datos de la Hoja 2:


Nota: Son mas registros de los que se pueden ver, esto es una muestra de los campos de las tablas y de la información que tienen.



David Vargas
Cristian Araya

Fecha: 23/11/2013
Hora Inicio: 1:00 pm
Hora Finalizada:  4:00 pm
Tiempo Laborado:   3 horas

domingo, 24 de noviembre de 2013

Datos Prueba V2.0

En la segunda versión ya el profesor reviso el modelo que habíamos propuesto y se paso a hacer los cambio pertinentes según las correcciones recibidas.


Los cambio ocurrieron de la siguiente manera:

Hoja1: Se cambió FechaNoticia por FechaInicioEdicion y ademas se agregaron los siguientes campos:


  • FechaFinEdicion
  • NombreEdicion
  • UsuarioQueComenta
  • PerteneceAPortada
Las tablas quedaron entonces de la siguiente manera:





Hoja 2:




Se agregaron mas noticias y comentarios.

David Vargas
Cristian Araya

Fecha: 22/11/2013
Hora Inicio: 5:00 pm
Hora Finalizada:  6:00 pm
Tiempo Laborado:   1 horas

Datos de Prueba V1.0

Se realiza la primera version de los datos de prueba


En esta edición se piensan y escriben los campos que van a tener los datos de prueba en el documento Excel.
Se insertan las primeras noticias y sus respectivas partes para completar los datos de prueba.
Las noticias se toman del sitio Pagina de Prensa Hondureña

La información entonces fue:

Hoja1:


 Hoja2:



David Vargas
Cristian Araya

Fecha: 21/11/2013
Hora Inicio: 1 pm
Hora Finalizada:  3:00 pm
Tiempo Laborado:   2 horas

Avance Migracion II

Se siguio realizando la migracion de los datos de prueba a la base de datos original, en este avance realizamos las siguientes variables tabla:


- DECLARE @SUBTEMA TABLE (Id INT IDENTITY(1,1),Tema INT, Nombre VARCHAR(50))

- DECLARE @USUARIO TABLE (Id INT IDENTITY(1,1), Nombre VARCHAR(100), Email VARCHAR(100))

- DECLARE @NOTICIA TABLE (Id INT IDENTITY(1,1), Redactor INT, SubTema INT, Titulo VARCHAR(1000), Contenido TEXT, INT,CalifPromedio INT,CantEnviadas INT)

- DECLARE @CALIFICACION TABLE (Id INT IDENTITY(1,1),TipoCalificacion INT,Usuario INT, Noticia INT)

- DECLARE @COMENTARIO TABLE (Id INT IDENTITY(1,1),Noticia INT,Usuario INT, Texto VARCHAR(1000))


Fecha: 23/11/2013
Hora Inicio: 5:00 pm
Hora Finalizada: 6:30 pm
Tiempo Laborado:  1hora y 30 minutos

Avance Migracion I

Se realizaron las primeras migraciones, para esta tarea se investigo las variables tabla para tener mas eficiencia en las consultas.

Para declarar una variable tabla se hace de la siguiente manera:


DECLARE @EDICION TABLE (Id INT IDENTITY(1,1), Nombre VARCHAR(50), FechaDesde DATE, FechaHasta DATE)

Lo que realizamos despues fue llenar estas tablas con la informacion de la base de datos de prueba o bien de los archivos de prueba que se encuentra en Excel.

-- Asignacion de Informacion a las variables tabla
INSERT INTO @EDICION (Nombre, FechaDesde, FechaHasta )
(SELECT DISTINCT V.NombreEdicion,V.FechaInicioEdicion,V.FechaFinEdicion
FROM [PruebaPeriodico].dbo.Hoja1$ V
WHERE V.NombreEdicion != 'NULL'
AND V.NombreEdicion != 'N/A' )

En este primer avance si realizaron las siguientes tablas:

DECLARE @REDACTOR TABLE (Id INT IDENTITY(1,1), Nombre VARCHAR(50))
DECLARE @TEMA TABLE (Id INT IDENTITY(1,1), Nombre VARCHAR(50))
DECLARE @TIPOCALIFICACION TABLE (Id INT IDENTITY(1,1), Nombre VARCHAR(50))

Fecha: 23/11/2013
Hora Inicio: 3:00 pm
Hora Finalizada: 4:30 pm
Tiempo Laborado:  1hora y 30 minutos

sábado, 23 de noviembre de 2013

Diagrama de la Base de Datos V2.0

Se corrige el diagrama de la base de datos de acuerdo a las correciones del profe y otras mas realizadas por nosotros, se supone que solo existe un periodico por lo cual se elimina la tabla periodico, y se agrega la portada y la edicion del periodico.




Fecha: 23/11/2013
Hora Inicio: 10:00 am
Hora Finalizada: 11:00 am
Tiempo Laborado:  1 hora

viernes, 22 de noviembre de 2013

Creacion de tablas y diagrama de base de datos en SQL

Se realiza en MS SQL el diagrama de la base de datos que realizamos anteriormente en papel y se crean todas las primary key y configuraciones iniciales para la base de datos del periodico digital



Fecha: 22/11/2013
Hora Inicio: 12.15 pm
Hora Finalizada: 1:00 pm
Tiempo Laborado:  45 minutos

jueves, 21 de noviembre de 2013

Diseño Datos Prueba

Se diseñaron las tablas no normalizadas que contendrán los datos de prueba. Se usaran dos tablas las cuales están dividido de la siguiente manera:

Tabla1:
Tabla2:

Fecha: 21/11/2013
Hora Inicio: 1.15 pm
Hora Finalizada: 1:40 pm
Tiempo Laborado:  25 minutos

Modelo Borrador

Realizamos un modelo borrador en papel de la base de datos. En conclusión determinamos 11 tablas diferentes, las cuales mostramos en seguida:


Como se puede observar los respectivos ranking se controlan con los campos de la tabla Noticia, esto debido a dar mas claridad y pensar que las transacciones se realicen de una manera mas sencilla. El paso siguiente es pasarlo a SQL y mostrárselo al profesor para que lo valide.

Fecha: 21/11/2013
Hora Inicio: 11.15 am
Hora Finalizada: 1:00 pm
Tiempo Laborado: 1hora con 45 minutos

Primer Avance

Se lee y se discute la especificación de la tarea con la idea de entender bien el problema. Se sacan palabras clave para poder hacer el modelo de una manera mas sencilla y eficiente. El tema que mas se discutió fue el ranking de las noticias.


Fecha: 21/11/2013
Hora Inicio: 10.15 am
Hora Finalizada: 11:00 am
Tiempo Laborado:  45 minutos

Especificacion Tercera Tarea Programada

ITCR – Escuela de Computación – Bases de datos – Prof, Fquiros – Noviembre 2013

Tercer Proyecto


Considere el siguiente problema:


Un periódico digital organiza las noticias por temas y subtemas, ejemplos de temas: Nacionales, Internacionales, sucesos, etc. Ejemplo de subtemas, para el tema Internacionales: América Latina, Europa, Asia, etc. Un usuario puede entrar a la portada, que muestra las principales noticias, o entrar a la página según el tema.


En la portada, quien la diseña, indica cuales principales noticias de cada tema son mostradas en la portada.


Cada noticia, al ser visitada, puede ser calificada, enviada por correo o comentada. Se llevan un “ranking” de las noticias, según han sido enviadas, calificadas (de 1 a 5 estrellas), comentadas o simplemente visitadas.  Este ranking, puede ser consultado por tema, subtema o de manera general (para todos los temas). Con respecto a la calificación, al desplegarse cada noticias se muestra su calificación basado en el promedio de todas las calificaciones recibidas. Para calificar, el usuario debe estar registrado (no puede ser un usuario anónimo).


Un usuario puede escoger que se le envíen automáticamente noticias por email, ya sea por tema o subtema, o según la persona que redacto la noticia.


Se pide:

+ Implementar la base de datos, mediante un script que creara la bd sobre una instalación inicialmente limpia.
+ Scripts de migración y llenado de datos
+ Hacer los procedimientos almacenados que implementan estas acciones:
 Aumentar la cuenta de visita a una noticia.
 Registro de una calificación y actualización del promedio de calificaciones.
 Listado de ultimas noticias, ya sea por tema, o de interés general (en la portada), de la más reciente a la más antigua, hay un máximo de noticias, que es establecido como un parámetro del sistema.

Listado de las noticias más visitadas (de más a menos), o más enviadas por correo (de más a menos) o mejor calificadas (de más a menos), ya sea por tema o por noticia de portada, sin exceder el máximo establecido como parámetro del sistema.


La generación de correos automáticos a usuarios, cuando una noticia ingresa.  No es necesario que implemente el envió del correo, pero sí que se registre que se envió.


+ Grupos de 2. Documentación. La misma indicada para los 2 proyectos previos.