BDD_Proyecto_G5
-
Upload
jorge-mino -
Category
Documents
-
view
216 -
download
0
Transcript of BDD_Proyecto_G5
-
8/18/2019 BDD_Proyecto_G5
1/35
ESCUELA POLITÉCNICA NACIONAL
FACULTAD DE INGENIERÍA DE SISTEMAS
TEMA
PROYECTO FINAL
MATERIA:
BASES DE DATOS DISTRIBUIDAS
PROFESOR
ING. HENRY ECHEVERRÍA
ESTUDIANTES
JOSÉ MARTÍN DÍAZ
RUBÉN ANDRÉS JÁCOME
JONATHAN JAVIER QUINCHIGUANGO
FECHA
01 DE AGOSTO DE 2015
-
8/18/2019 BDD_Proyecto_G5
2/35
TABLA DE CONTENIDO
ESCENARIO .............................................................................................................................................. 3
MODELO ENTIDAD/RELACIÓN ................................................................................................................. 4
MODELO RELACIONAL ............................................................................................................................. 5
ROLES .................................................................................................................................................. 6
REPLICACIÓN ....................................................................................................................................... 6
FRAGMENTACIÓN .......................... .......................... .......................... ......................... ......................... 6
ESQUEMA DE ASIGNACIÓN .................................................................................................................. 7
BASE DE DATOS CENTRALIZADA .............................................................................................................. 8
ESQUEMA DE LA BASE DE DATOS CENTRALIZADA .......................... ......................... .......................... ... 8
SERVIDORES VINCULADOS ..................................................................................................................... 11
FRAGMENTACIÓN Y REPLICACIÓN DE LA BASE DE DATOS CENTRALIZADA ..... .......................... .............. 15
VISTAS PARTICIONADAS ........................................................................................................................ 19
APLICACIÓN WEB .................................................................................................................................. 23
EJECUCIÓN DE LA APLICACIÓN ........................ .......................... ......................... ........................... ..... 27
-
8/18/2019 BDD_Proyecto_G5
3/35
ESCENARIO
El Instituto de arte “Chords & Colors” posee dos centros locales en la ciudad. En cada uno de ellos se dictan
algunos cursos, los cuales cuentan con varios alumnos. Cada centro cuenta con un grupo de tutores que imparten
los cursos.
Actualmente el Instituto utiliza una base de datos relacional centralizada, a la cual acceden los centros, con el
esquema que se muestra a continuación.
Se requiere diseñar una base de datos distribuida que gestione la información que maneja el Instituto, para
conseguir la mayor autonomía local posible en cada centro, para ello se conoce que el Instituto funciona de la
siguiente manera:
- Los centros se identifican mediante su código de centro, que es 01 y 02 respectivamente.
- Cada centro tiene un nombre, una dirección y un teléfono.
- En cada centro trabajan varios tutores, que sólo pertenecen a uno de los centros.
-
El Instituto almacena los siguientes datos de cada tutor: código, CI, nombre, teléfono, especialidad,salario, fecha de contrato.
- En el centro principal (Cód_Centro = 01) se elaboran las nóminas de los tutores contratados por el
Instituto y de aquí se envían al otro Centro para ser repartidas a los tutores. Por esta razón se guarda
información sobre el salario de los tutores del Instituto, así como también su fecha de contrato.
- Cada centro dicta algunos cursos. Dichos cursos son exclusivos de cada centro. Sobre ellos existe un
código, una descripción, un día a la semana y una hora de inicio. Además, un curso puede ser del tipo arte
o música.
- Varios alumnos pueden inscribirse dentro de cada curso, estableciéndose una fecha de inscripción por
alumno y curso. Un alumno tiene un código que lo identifica, un nombre, edad y teléfono.
- Además un tutor dirige un solo curso en específico.
Se solicita:
-
Realizar el diseño centralizado puro de la BD
Esquema E/R
- Identificar los sitios de distribución (SEDES) y sus respectivos roles
Tabla de sedes y roles
-
Analizar qué distribuir (identificación accesos frecuentes, etc)
Resumen del análisis
-
Fragmentación
Esquema de fragmentación- Asignación de fragmentos a los sitios
Esquema de asignación
- Replicación
Esquema de replicación
-
8/18/2019 BDD_Proyecto_G5
4/35
MODELO ENTIDAD/RELACIÓN
-
8/18/2019 BDD_Proyecto_G5
5/35
MODELO RELACIONAL
CENTRO (cod_centro, nombre_centro, dirección_centro, teléfono_centro)
TUTOR (cod_tutor, ci_tutor, nombre_tutor, teléfono_tutor, especialidad, salario, fecha_contrato, cod_centro)
CURSO (cod_curso, descripción, dia, hora, cod_centro, tipo, cod_tutor)
TOMA_CURSO (cod_curso, cod_alumno, fecha_inscripcion)
ALUMNO (cod_alumno, nombre_alumno, edad, teléfono_alumno)
DNA, UNA
DNA, UNA
DNA, UNA
DNA, UNA
DNA, UNA
-
8/18/2019 BDD_Proyecto_G5
6/35
ROLES
Centro Rol01 Nóminas de Tutores
Centro
02 Centro
REPLICACIÓN
Centro Porque en cada centro es necesaria la información de todos los centros.
FRAGMENTACIÓN
1.
Fragmentación Vertical
_ó ∏ ó, ,ℎ_ ()
_ó ∏ ó,,,é,,_ ()
Porque en el centro 01, se elaboran las nóminas de los tutores (salario y fecha de contrato) y en
cada centro se necesita tener la información de sus tutores (ci, nombre, teléfono, especialidad).
2.
Fragmentación Horizontal Primaria
_ó ó = (_ó) {01, 02}
Porque en cada centro se necesita tener la información de sus respectivos tutores.
-
8/18/2019 BDD_Proyecto_G5
7/35
3.
Fragmentación Horizontal Primaria
ó= () {01,02}
Porque en cada centro se necesita tener la información de sus respectivos cursos.
4.
Fragmentación Horizontal Derivada
_ _ ⋉
Porque en cada centro se necesita tener la información de qué estudiantes toman qué cursos.
5.
Fragmentación Horizontal Derivada
_ ⋉_
Porque en cada centro se necesita tener la información de sus respectivos estudiantes.
ESQUEMA DE ASIGNACIÓN
01 02
Centro Centro Centro
Tutor Tutor_nómina
Tutor_información 01
Tutor_información 02
Curso Curso 01 Curso 02
Toma_curso Toma_curso 01 Toma_curso 02
Alumno Alumno 01 Alumno 02
-
8/18/2019 BDD_Proyecto_G5
8/35
BASE DE DATOS CENTRALIZADA
ESQUEMA DE LA BASE DE DATOS CENTRALIZADA
USE MASTERDROP DATABASE PROYECTOCREATE DATABASE PROYECTOUSE PROYECTO
Create table [Centro](
[codCentro] Char(3) NOT NULL,[nombre] Varchar(30) NOT NULL,[direccion] Varchar(30) NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codCentro])) go
Create table [Alumno](
[codAlumno] Char(3) NOT NULL,[nombre] Varchar(40) NOT NULL,[fechaNacimiento] date NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codAlumno])) go
Create table [Tutor](
[codTutor] Char(3) NOT NULL,[CI] Char(10) NOT NULL,[nombre] Varchar(40) NOT NULL,[telefono] Char(10) NOT NULL,[especialidad] Varchar(30) NOT NULL,[salario] Money NOT NULL,[fechaContrato] Date NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codTutor])) go
Create table [Curso](
[codCurso] Char(3) NOT NULL,[Tipo] Varchar(10) NOT NULL,[descripcion] Varchar(50) NOT NULL,[dia] Varchar(10) NOT NULL,[hora] time NOT NULL,[codCentro] Char(3) NOT NULL,[codTutor] Char(3) NOT NULL,
Primary Key ([codCurso])) go
-
8/18/2019 BDD_Proyecto_G5
9/35
Create table [TomaCurso](
[codCurso] Char(3) NOT NULL,[codAlumno] Char(3) NOT NULL,[fechaInicio] Date NOT NULL,
Primary Key ([codCurso],[codAlumno])) go
Alter table [Tutor] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codTutor]) references [Tutor] ([codTutor]) on update no action on delete no action go
Alter table [TomaCurso] add foreign key([codCurso]) references [Curso] ([codCurso]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codAlumno]) references [Alumno] ([codAlumno]) on update no action on delete no action go
SET DATEFORMAT DMY
INSERT INTO CENTRO VALUES ('01', 'CENTROUNO', 'AMAZONAS Y NACIONES UNIDAS', '2567896451')INSERT INTO CENTRO VALUES ('02', 'CENTRODOS', 'COTOCOLLAO', '2567896451')
INSERT INTO ALUMNO VALUES ('A01', 'JORGE HERRERA', '30/05/1995', '0478965580')INSERT INTO ALUMNO VALUES ('A02', 'ANA DIAZ', '17/07/1995', '0047890025')INSERT INTO ALUMNO VALUES ('A03', 'JUAN VELASCO', '09/02/1994', '0478945658')INSERT INTO ALUMNO VALUES ('A04', 'KEVIN MORENO', '1/11/1994', '1111965580')
INSERT INTO Tutor VALUES ('T01', '1513365598', 'JUAN PEREZ', '2655672658', 'CANTO', 3000, '30/06/2005', '01')INSERT INTO Tutor VALUES ('T02', '1213363398', 'FRANCISCO CALDERON', '2612345654', 'PIANO', 5000, '25/03/2000', '01')INSERT INTO Tutor VALUES ('T03', '1113365398', 'MARTIN MEJIA', '2287935663', 'GUITARRA', 8000, '16/12/2001', '02')INSERT INTO Tutor VALUES ('T04', '1011765598', 'GABRIEL REYES', '2658294631',
'ARTES', 4000, '10/02/2010', '02')
INSERT INTO Curso VALUES ('C01', 'PINTURA', 'PINTURA EN PAPEL', 'MIERCOLES', '09:00:00', '02', 'T04')INSERT INTO Curso VALUES ('C02', 'GUITARRA', 'CLASES DE GUITARRA', 'MARTES', '10:00:00', '02', 'T03')INSERT INTO Curso VALUES ('C03', 'CANTO', 'CLASES DE CANTO', 'LUNES', '16:00:00', '01', 'T01')
-
8/18/2019 BDD_Proyecto_G5
10/35
INSERT INTO Curso VALUES ('C04', 'PIANO', 'CLASES DE PIANO', 'VIERNES', '08:00:00', '01', 'T02')
INSERT INTO TomaCurso VALUES ('C01', 'A01', '10/10/2014')INSERT INTO TomaCurso VALUES ('C02', 'A02', '05/06/2015')INSERT INTO TomaCurso VALUES ('C03', 'A03', '27/11/2014')INSERT INTO TomaCurso VALUES ('C04', 'A04', '09/1/2015')
SELECT * FROM PROYECTO.DBO.CENTRO
SELECT * FROM PROYECTO.DBO.ALUMNO
SELECT * FROM PROYECTO.DBO.CURSO
SELECT * FROM PROYECTO.DBO.TOMACURSO
SELECT * FROM PROYECTO.DBO.TUTOR
-
8/18/2019 BDD_Proyecto_G5
11/35
SERVIDORES VINCULADOSComo se detalla en el enunciado del problema anterior, esta base de datos deberá ser distribuida en 2
nodos, cada uno con sus roles definidos. (Roles definidos con anterioridad).Para esto deberemos crear
las siguientes bases de datos en los diferentes nodos. De esta manera podremos lograr que cada nodo
cumpla con las funcionalidades para las que fueron definidas.
CENTRO UNO:
USE masterDROP DATABASE CENTROUNOcreate database CENTROUNOUSE CENTROUNOCreate table [Centro](
[codCentro] Char(3) NOT NULL,[nombre] Varchar(30) NOT NULL,[direccion] Varchar(30) NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codCentro])) go
Create table [Alumno](
[codAlumno] Char(3) NOT NULL,[nombre] Varchar(40) NOT NULL,[fechaNacimiento] date NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codAlumno])) go
Create table [Tutor](
[codTutor] Char(3) NOT NULL,[CI] Char(10) NOT NULL,[nombre] Varchar(40) NOT NULL,[telefono] Char(10) NOT NULL,[especialidad] Varchar(30) NOT NULL,[salario] Money NOT NULL,[fechaContrato] Date NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codTutor]))
go
Create table [TutorNomina](
[codTutor] Char(3) NOT NULL, [salario] Money NOT NULL,[fechaContrato] Date NULL,
Primary Key ([codTutor])) go
-
8/18/2019 BDD_Proyecto_G5
12/35
Create table [Curso](
[codCurso] Char(3) NOT NULL,[Tipo] Varchar(10) NOT NULL,[descripcion] Varchar(50) NOT NULL,[dia] Varchar(10) NOT NULL,[hora] time NOT NULL,[codCentro] Char(3) NOT NULL,[codTutor] Char(3) NOT NULL,
Primary Key ([codCurso])) go
Create table [TomaCurso](
[codCurso] Char(3) NOT NULL,[codAlumno] Char(3) NOT NULL,[fechaInicio] Date NOT NULL,
Primary Key ([codCurso],[codAlumno]))
go
Alter table [Tutor] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codTutor]) references [Tutor] ([codTutor]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codCurso]) references [Curso] ([codCurso]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codAlumno]) references [Alumno] ([codAlumno]) on update no action on delete no action go
-
8/18/2019 BDD_Proyecto_G5
13/35
CENTRO DOS:
USE masterDROP DATABASE CENTRODOS
create database CENTRODOS
USE CENTRODOS
Create table [Centro](
[codCentro] Char(3) NOT NULL,[nombre] Varchar(30) NOT NULL,[direccion] Varchar(30) NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codCentro])) go
Create table [Alumno](
[codAlumno] Char(3) NOT NULL,[nombre] Varchar(40) NOT NULL,[fechaNacimiento] date NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codAlumno])) go
Create table [Tutor](
[codTutor] Char(3) NOT NULL,[CI] Char(10) NOT NULL,
[nombre] Varchar(40) NOT NULL,[telefono] Char(10) NOT NULL,[especialidad] Varchar(30) NOT NULL,[salario] Money NOT NULL,[fechaContrato] Date NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codTutor])) go
Create table [Curso](
[codCurso] Char(3) NOT NULL,
[Tipo] Varchar(10) NOT NULL,[descripcion] Varchar(50) NOT NULL,[dia] Varchar(10) NOT NULL,[hora] time NOT NULL,[codCentro] Char(3) NOT NULL,[codTutor] Char(3) NOT NULL,
Primary Key ([codCurso])) go
-
8/18/2019 BDD_Proyecto_G5
14/35
Create table [TomaCurso](
[codCurso] Char(3) NOT NULL,[codAlumno] Char(3) NOT NULL,[fechaInicio] Date NOT NULL,
Primary Key ([codCurso],[codAlumno])) go
Alter table [Tutor] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codTutor]) references [Tutor] ([codTutor]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codCurso]) references [Curso]
([codCurso]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codAlumno]) references [Alumno] ([codAlumno]) on update no action on delete no action go
Podemos observar que aunque ambos nodos son bastante similares, la tabla de Tutor Nomina
únicamente está ubicada en el centro UNO, puesto que es únicamente aquí en donde se almacenará
esta información. Aparte de este cambio, la base es sumamente similar.
-
8/18/2019 BDD_Proyecto_G5
15/35
FRAGMENTACIÓN Y REPLICACIÓN DE LA BASE DE DATOSCENTRALIZADA
Sabemos que al ser una base de datos distribuida, deben existir datos locales y remotos para permitir un
mejor rendimiento de las consultas, inserciones y eliminaciones. La fragmentación y replicación nos
ayudará con este problema.
Utilizaremos los esquemas de asignación y fragmentación antes definidos y simplemente los pasaremos
a la base de datos real definida.
Para esto utilizaremos sentencias SQL que nos permitan cumplir con esta funcionalidad.
REPLICACION
TABLA CENTRO
INSERT INTO CENTROUNO.DBO.CentroSELECT * FROM PROYECTO.DBO.Centro
SELECT * FROM CENTROUNO.DBO.CENTRO
INSERT INTO CENTRODOS.DBO.CentroSELECT * FROM PROYECTO.dbo.Centro
SELECT * FROM CENTRODOS.DBO.CENTRO
De esta manera replicaremos los datos de la base de datos centralizada referente a los centros en todos
los nodos de la base de datos distribuida.
-
8/18/2019 BDD_Proyecto_G5
16/35
FRAGMENTACION VERTICAL
TABLA NOMINA TUTOR
INSERT INTO CENTROUNO.DBO.TUTORNOMINASELECT CODTUTOR, SALARIO, FECHACONTRATO FROM PROYECTO.DBO.TUTOR
SELECT * FROM CENTROUNO.DBO.TUTORNOMINA
FRAGMENTACION HORIZONTAL
TABLA TUTOR (FRAGMENTACION HORIZONTAL PRIMARIA)
INSERT INTO CENTROUNO.dbo.TutorSELECT * FROM PROYECTO.DBO.TutorWHERE codCentro = '01'
SELECT * FROM CENTROUNO.DBO.TUTOR
INSERT INTO CENTRODOS.DBO.TUTORSELECT * FROM PROYECTO.DBO.TUTORWHERE CODCENTRO = '02'
SELECT * FROM CENTRODOS.DBO.TUTOR
-
8/18/2019 BDD_Proyecto_G5
17/35
TABLA CURSO (FRAGMENTACION HORIZONTAL PRIMARIA)
INSERT INTO CENTROUNO.DBO.CURSOSELECT * FROM PROYECTO.DBO.CURSOWHERE CODCENTRO = '01'
SELECT * FROM CENTROUNO.DBO.CURSO
INSERT INTO CENTRODOS.DBO.CURSOSELECT * FROM PROYECTO.DBO.CURSOWHERE CODCENTRO = '02'
SELECT * FROM CENTRODOS.DBO.CURSO
TABLA ALUMNO (FRAGMENTACION HORIZONTAL DERIVADA)
Como podemos observar, la tabla alumno no puede ser fragmentada directamente puesto que ningún
dato de esta tabla es utilizado para una fragmentación. Para resolver esto es necesario fragmentar en
primer lugar la tabla tomaCurso. Sin embargo esta tabla no podrá ser llenada puesto que su clave
foránea (codAlumno) depende de la tabla alumno (la cual aún no tiene valores en los servidores
distribuidos).
Para resolver este pequeño problema utilizaremos un “artificio” que consiste en llenar la tabla alumnos
en los diferentes nodos con todos los alumnos de la base centralizada (aunque estos alumnos no sean
parte de cada nodo) para luego borrar aquellos que no pertenezcan al nodo correspondiente. De la
siguiente manera:
INSERT INTO CENTROUNO.DBO.ALUMNOSELECT * FROM PROYECTO.DBO.ALUMNO
INSERT INTO CENTRODOS.DBO.ALUMNOSELECT * FROM PROYECTO.DBO.ALUMNO
Aquí brindaremos a ambos nodos todos los alumnos disponibles en la base de datos centralizada. De
esta manera podremos fragmentar la tabla tomaCurso
-
8/18/2019 BDD_Proyecto_G5
18/35
TABLA TOMACURSO (FRAGMENTACION HORIZONTAL DERIVADA)
INSERT INTO CENTROUNO.DBO.TOMACURSOSELECT * FROM PROYECTO.DBO.TOMACURSOWHERE CODCURSO IN (SELECT CODCURSO FROM CENTROUNO.DBO.CURSO)
SELECT * FROM CENTROUNO.DBO.TOMACURSO
INSERT INTO CENTRODOS.DBO.TOMACURSOSELECT * FROM PROYECTO.DBO.TOMACURSOWHERE CODCURSO IN (SELECT CODCURSO FROM CENTRODOS.DBO.CURSO)
SELECT * FROM CENTRODOS.DBO.TOMACURSO
Como cada nodo ya conoce los codAlumno, se podrá ejecutar esta sentencia para poder fragmentar la
tabla tomaCurso.
Finalmente borraremos los datos de la tabla Alumno que no corresponden a ese nodo dependiendo de
la fragmentación de la tabla tomaCurso que acabamos de realizar.
DELETE CENTROUNO.DBO.ALUMNOWHERE CODALUMNO NOT IN (SELECT CODALUMNO FROM CENTROUNO.DBO.TOMACURSO)
SELECT * FROM CENTROUNO.DBO.ALUMNO
DELETE CENTRODOS.DBO.ALUMNOWHERE CODALUMNO NOT IN (SELECT CODALUMNO FROM CENTRODOS.DBO.TOMACURSO)
SELECT * FROM CENTRODOS.DBO.ALUMNO
Y así hemos logrado realizar las fragmentaciones mediante el uso sentencias SQL y un poco de ingenio.
-
8/18/2019 BDD_Proyecto_G5
19/35
VISTAS PARTICIONADAS
Las vistas particionadas nos proveen de una manera rápida y sencilla de realizar consultas e inserciones
en las diferentes tablas. Mediante la definición de un constraint del tipo check la mismas vista será la
encargada de decidir a cuál de los servidores deberá enviar la información.
En primer lugar generaremos nuevas claves primarias en las tablas, puesto que sin estas no se puede
realizar los checks. En el centro uno tendríamos lo siguiente:
create database CENTROUNOUSE CENTROUNOCreate table [Centro](
[codCentro] Char(3) NOT NULL,[nombre] Varchar(30) NOT NULL,[direccion] Varchar(30) NOT NULL,[telefono] Char(10) NOT NULL,
Primary Key ([codCentro])) go
Create table [Alumno](
[codAlumno] Char(3) NOT NULL,[nombre] Varchar(40) NOT NULL,[fechaNacimiento] date NOT NULL,[telefono] Char(10) NOT NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codAlumno], [codCentro]))
go
DROP TABLE TUTORCreate table [Tutor](
[codTutor] Char(3) NOT NULL,[CI] Char(10) NOT NULL,[nombre] Varchar(40) NOT NULL,[telefono] Char(10) NOT NULL,[especialidad] Varchar(30) NOT NULL,[salario] Money NOT NULL,[fechaContrato] Date NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codTutor], [codCentro])) go
drop table tutornominaCreate table [TutorNomina](
[codTutor] Char(3) NOT NULL, [salario] Money NOT NULL,[fechaContrato] Date NULL,
-
8/18/2019 BDD_Proyecto_G5
20/35
[codCentro] Char(3) NOT NULL,Primary Key ([codTutor], [codCentro])) go
Create table [Curso](
[codCurso] Char(3) NOT NULL,[Tipo] Varchar(10) NOT NULL,[descripcion] Varchar(50) NOT NULL,[dia] Varchar(10) NOT NULL,[hora] time NOT NULL,[codCentro] Char(3) NOT NULL,[codTutor] Char(3) NOT NULL,
Primary Key ([codCurso], [codCentro])) go
Create table [TomaCurso](
[codCurso] Char(3) NOT NULL,[codAlumno] Char(3) NOT NULL,[fechaInicio] Date NOT NULL,[codCentro] Char(3) NOT NULL,
Primary Key ([codCurso],[codAlumno], [codCentro])) go
Como podemos observar, todas las tablas poseen ahora una clave primaria con el nombre de
“codCentro”, puesto que será en esta columna en donde se definirán los constraints tipo check.
Antes de eso debemos relacionar las tablas con claves foráneas.
Alter table [Tutor] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codCentro]) references [Centro] ([codCentro]) on update no action on delete no action goAlter table [Curso] add foreign key([codTutor], [codCentro]) references [Tutor] ([codTutor], [codCentro]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codCurso], [codCentro]) references
[Curso] ([codCurso], [codCentro]) on update no action on delete no action goAlter table [TomaCurso] add foreign key([codAlumno], [codCentro]) references [Alumno] ([codAlumno], [codCentro]) on update no action on delete no action Go
-
8/18/2019 BDD_Proyecto_G5
21/35
Y finalmente realizaremos los check constraints.
ALTER TABLE TUTOR ADD CONSTRAINT ck_tutor check (codCentro = '01')
ALTER TABLE CURSO ADD CONSTRAINT ck_curso check (codCentro = '01')
ALTER TABLE ALUMNO ADD CONSTRAINT ck_alumno check (codCentro = '01')
ALTER TABLE TOMACURSO ADD CONSTRAINT ck_tomaCurso check (codCentro = '01')
Hay que tomar en cuenta que el código para el que estamos definiendo los checks es para el centro uno,
por lo que todos se igualan al valor de “01”. El procedimiento es exactamente igual para el centro 2 con
la diferencia del valor al que se igualan los checks.
VISTAS
Ahora finalmente podremos crear las vistas particionadas. Cabe recalcar que para que funcionenperfectamente es necesario realizar las vistas en todos los nodos de la base de datos distribuida.
SET XACT_ABORT ON
CREATE VIEW V_ALUMNOASSELECT * FROM CENTROUNO.DBO.ALUMNOUNION ALLSELECT * FROM CENTRODOS.DBO.ALUMNO
CREATE VIEW V_CURSO
ASSELECT * FROM CENTROUNO.DBO.CURSOUNION ALLSELECT * FROM CENTRODOS.DBO.CURSO
CREATE VIEW V_TOMACURSOASSELECT * FROM CENTROUNO.DBO.TOMACURSOUNION ALLSELECT * FROM CENTRODOS.DBO.TOMACURSO
CREATE VIEW V_TUTORASSELECT * FROM CENTROUNO.DBO.TUTORUNION ALLSELECT * FROM CENTRODOS.DBO.TUTOR
Al modificar la base de datos para poder realizar estas vistas, es necesario borrar toda la base puesto
que tiene nuevos constraints.
-
8/18/2019 BDD_Proyecto_G5
22/35
Sin embargo el nuevo ingreso de datos no será ningún problema para las nuevas vistas puesto que estas
automáticamente distribuirán los datos. Aunque la vista posee todos los datos, si realizamos consultas
únicamente a los centros distribuidos, se podrá observar que estos únicamente tienen los datos que les
corresponden
Por ejemplo:
SET DATEFORMAT DMY
INSERT INTO V_ALUMNO VALUES ('A01', 'JORGE HERRERA', '30/05/1995', '0478965580', '02')INSERT INTO V_ALUMNO VALUES ('A02', 'ANA DIAZ', '17/07/1995', '0047890025', '02')INSERT INTO V_ALUMNO VALUES ('A03', 'JUAN VELASCO', '09/02/1994', '0478945658', '01')INSERT INTO V_ALUMNO VALUES ('A04', 'KEVIN MORENO', '1/11/1994',
'1111965580', '01')
SELECT * FROM V_ALUMNO
SELECT * FROM CENTROUNO.DBO.ALUMNO
SELECT * FROM CENTRODOS.DBO.ALUMNO
-
8/18/2019 BDD_Proyecto_G5
23/35
APLICACIÓN WEB
La aplicación se conecta con las vistas definidas anteriormente y permite realizar las operaciones de
consulta e inserción de datos. Debido a que se conecta directamente con las vistas particionadas
siempre tendremos disponible toda la información de ambos centros. Y en el caso de las inserciones, las
vistas también nos ayudan a insertar los datos en el nodo correspondiente.
La conexión con las vistas se realiza a través de procedimientos almacenados.
-
8/18/2019 BDD_Proyecto_G5
24/35
Dado que se realizarán las operaciones de consulta e inserción, se han definido dos procedimientos
almacenados por cada tabla, uno por cada operación, los cuales se muestran a continuación:
Nótese que las operaciones se realizan sobre las vistas.
Procedimiento almacenado para la consulta de la información de los Centros
Procedimiento almacenado para la consulta de Tutores
-
8/18/2019 BDD_Proyecto_G5
25/35
Procedimiento almacenado para la inserción de Tutores
Procedimiento almacenado para la consulta de Alumnos
Procedimiento almacenado para la inserción de Alumnos
Procedimiento almacenado para la consulta de Cursos
-
8/18/2019 BDD_Proyecto_G5
26/35
Procedimiento almacenado para la inserción de Cursos
-
8/18/2019 BDD_Proyecto_G5
27/35
EJECUCIÓN DE LA APLICACIÓN
-
8/18/2019 BDD_Proyecto_G5
28/35
-
8/18/2019 BDD_Proyecto_G5
29/35
-
8/18/2019 BDD_Proyecto_G5
30/35
-
8/18/2019 BDD_Proyecto_G5
31/35
Ejemplo de Inserción
Comprobamos la inserción de un alumno.
Presionamos el botón Insertar y refrescamos la página web
-
8/18/2019 BDD_Proyecto_G5
32/35
Nos muestra que se ha insertado
Ahora verificamos que se haya insertado correctamente en la vista.
-
8/18/2019 BDD_Proyecto_G5
33/35
Ahora verificamos que se haya insertado en el nodo correcto, en este caso es el Centro 01.
-
8/18/2019 BDD_Proyecto_G5
34/35
Por último verificamos que no se haya insertado en el Centro 02
-
8/18/2019 BDD_Proyecto_G5
35/35
Efectivamente todo ha ocurrido como se esperaba.