bdd_proyecto_g5

Upload: jorge-mino

Post on 06-Jul-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.