El dia de hoy se entendió el problema, se creo una base de datos basada en el diagrama del profesor que se hizo en clases el dia de ayer. Para el problema se tomó la desición de no incluir una tabla Visitas debido a que puede existir visitar a articulos o noticias que no dependan de ningún Usuario, de modo que la tabla es inecesaria. Entonces, para ello solo se agrega una atributo a cada noticia que se llama Visitas, que es un contador que inicia en 0 y va a umentando con cada visita por medio de un SP que se programará mas adelante.
La siguiente es una foto del diagrama físico final de la base de datos:
Relacionar la tabla de Notificaciones con las tablas Autores, Temas y Subtemas no significa que existe una relación recursiva. Cada Autor, Tema y Subtema va a tener una entrada también en la tabla de notificaciones, de manera que los Usuarios puede pedir notificaciones sobre aquellos temas o autores que les interese por medio de la tabla NotificacionesXUsuarios.
Además, se implementa el uso de llaves compuestas para aquellas tablas que son de la forma AxB siendo A y B tablas que tienen una relación n a n. La tabla de NoticiasXPortadas y NotificacionesXUsuarios implementan esta forma de llave primaria.
En la siguiente página se puede apreciar la sintaxis de como se hace uso de PRIMARY KEY(A, B)
Adjuntamos abajo el Script de creación de la BD, Tablas y Relaciones:
USE [master]
GO
CREATE DATABASE [III Proyecto - WebNews]
GO
USE [III Proyecto - WebNews]
GO
CREATE TABLE Noticias (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Titulo varchar(200) NOT NULL,
Texto varchar(MAX) NOT NULL,
Fecha date NOT NULL,
Visitas int NOT NULL,
Fk_Autor int NOT NULL,
Fk_Subtema int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Temas (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Nombre varchar(100) NOT NULL,
Visitas int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Subtemas (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Nombre varchar(100) NOT NULL,
Fk_Tema int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Autores (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Nombre varchar(50) NOT NULL,
Email varchar(50) NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Portadas (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Fecha date NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE NoticiasXPortadas (
Activo bit NOT NULL,
OrdenDespliegue varchar(1) NULL,
Fk_Portada int NOT NULL,
Fk_Noticia int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL,
PRIMARY KEY (Fk_Portada, Fk_Noticia)
)
GO
CREATE TABLE Usuarios (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Nombre varchar(50) NOT NULL,
Email varchar(50) NOT NULL,
Activo bit NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Calificaciones (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Calificacion int NOT NULL,
Fecha date NOT NULL,
Fk_Usuario int NOT NULL,
Fk_Noticia int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Comentarios (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Comentario varchar(500) NOT NULL,
Fecha date NOT NULL,
Fk_Usuario int NOT NULL,
Fk_Noticia int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Envios (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
TextoEnvio varchar(MAX) NOT NULL,
Fecha date NOT NULL,
Fk_Usuario int NOT NULL,
Fk_Noticia int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE Notificaciones (
ID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
IDTipoFk int NOT NULL,
Fk_Tema int NULL,
Fk_Subtema int NULL,
Fk_Autor int NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL
)
GO
CREATE TABLE NotificacionesXUsuarios (
Fk_Usuario int NOT NULL,
Fk_Notificacion int NOT NULL,
PostIn varchar(15) NULL,
PostBy varchar(50) NULL,
PostDate datetime NULL,
PRIMARY KEY (Fk_Usuario, Fk_Notificacion)
)
GO
ALTER TABLE Noticias
ADD CONSTRAINT FK_Noticias_Autores
FOREIGN KEY (Fk_Autor)
REFERENCES Autores (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Noticias
ADD CONSTRAINT FK_Noticias_Subtemas
FOREIGN KEY (Fk_Subtema)
REFERENCES Subtemas (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Subtemas
ADD CONSTRAINT FK_Subtemas_Temas
FOREIGN KEY (Fk_Tema)
REFERENCES Temas (ID)
ON DELETE CASCADE;
GO
ALTER TABLE NoticiasXPortadas
ADD CONSTRAINT FK_NoticiasXPortadas_Portadas
FOREIGN KEY (Fk_Portada)
REFERENCES Portadas (ID)
ON DELETE CASCADE;
GO
ALTER TABLE NoticiasXPortadas
ADD CONSTRAINT FK_NoticiasXPortadas_Noticias
FOREIGN KEY (Fk_Noticia)
REFERENCES Noticias (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Calificaciones
ADD CONSTRAINT FK_Calificaciones_Usuarios
FOREIGN KEY (Fk_Usuario)
REFERENCES Usuarios (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Calificaciones
ADD CONSTRAINT FK_Calificaciones_Noticias
FOREIGN KEY (Fk_Noticia)
REFERENCES Noticias (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Comentarios
ADD CONSTRAINT FK_Comentarios_Usuarios
FOREIGN KEY (Fk_Usuario)
REFERENCES Usuarios (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Comentarios
ADD CONSTRAINT FK_Comentarios_Noticias
FOREIGN KEY (Fk_Noticia)
REFERENCES Noticias (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Envios
ADD CONSTRAINT FK_Envios_Usuarios
FOREIGN KEY (Fk_Usuario)
REFERENCES Usuarios (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Envios
ADD CONSTRAINT FK_Envios_Noticias
FOREIGN KEY (Fk_Noticia)
REFERENCES Noticias (ID)
ON DELETE CASCADE;
GO
ALTER TABLE Notificaciones
ADD CONSTRAINT FK_Notificaciones_Temas
FOREIGN KEY (Fk_Tema)
REFERENCES Temas (ID)
GO
ALTER TABLE Notificaciones
ADD CONSTRAINT FK_Notificaciones_Subtemas
FOREIGN KEY (Fk_Subtema)
REFERENCES Subtemas (ID)
GO
ALTER TABLE Notificaciones
ADD CONSTRAINT FK_Notificaciones_Autores
FOREIGN KEY (Fk_Autor)
REFERENCES Autores (ID)
GO
ALTER TABLE NotificacionesXUsuarios
ADD CONSTRAINT FK_NotificacionesXUsuarios_Usuarios
FOREIGN KEY (Fk_Usuario)
REFERENCES Usuarios (ID)
ON DELETE CASCADE;
GO
ALTER TABLE NotificacionesXUsuarios
ADD CONSTRAINT FK_NotificacionesXUsuarios_Notificaciones
FOREIGN KEY (Fk_Notificacion)
REFERENCES Notificaciones (ID)
ON DELETE CASCADE;
GO
No hay comentarios:
Publicar un comentario