MySQL - Como derivar una herencia disjunta en MySQL.

 
Vista:
Imágen de perfil de Stefano
Val: 9
Ha disminuido su posición en 6 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Como derivar una herencia disjunta en MySQL.

Publicado por Stefano (6 intervenciones) el 28/09/2019 08:39:36
Hola gente de LWP. Tengo una duda de como puedo derivar una herencia TOTAL Y DISJUNTA a MySQL.

Pongamos el siguiente ejemplo:
http://vvcap.com/krwB7IOEx

Los problemas son:
1) La tabla Protocolo debe tener un atributo foráneo haciendo referencia a un id de paciente (Humano o Animal).
2) Un paciente debe pertenecer SI O SÍ a alguna de sus sub clases (Humano o Animal) pero NUNCA a ambas a la vez.

Propuse el siguiente código:
Para la creación del esquema de la base de datos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE IF NOT EXISTS `Paciente` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(255) DEFAULT NULL,
  `derivador` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
CREATE TABLE IF NOT EXISTS `Humano` (
  `paciente` INT(11) NOT NULL,
  PRIMARY KEY (`paciente`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
CREATE TABLE IF NOT EXISTS `Animal` (
  `paciente` INT(11) NOT NULL,
  PRIMARY KEY (`paciente`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
CREATE TABLE IF NOT EXISTS `Protocolo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `paciente` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Para las restricciones de integridad:
1
2
3
4
5
ALTER TABLE Paciente ADD FOREIGN KEY (derivador) REFERENCES Derivador(id) ON DELETE RESTRICT ON UPDATE CASCADE;
 
ALTER TABLE Animal ADD FOREIGN KEY (paciente) REFERENCES Paciente(id) ON DELETE RESTRICT ON UPDATE CASCADE;
 
ALTER TABLE Humano ADD FOREIGN KEY (paciente) REFERENCES Paciente(id) ON DELETE RESTRICT ON UPDATE CASCADE;

Este código propuesto no me da la seguridad de que todo Paciente pertenezca a alguna de sus subclases pues
INSERT INTO Paciente VALUES ( ... ) crearia una tupla violando mis requerimientos de dominio.
He pensado en crear aserciones pero me ha generado la duda de que yo para ingresar un paciente hago algo asi:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sql_paciente = "INSERT INTO Paciente VALUES (0)";
		$query_paciente = mysqli_query($con, $sql_paciente);
 
		if ($query_paciente) {
			// Obtengo el id del paciente insertado
			$paciente = mysqli_insert_id($con);
 
               /* QUE PASA SI FALLA ACÁ? */
 
			$sql_humano = "INSERT INTO Humano VALUES ('$paciente')";
			$query_humano = mysqli_query($con, $sql_humano);
 
			if ($query_humano) {
                       .... mensaje de exito
                        } else {
                          ... mensaje de error
                       }

Mi duda es que si yo creo una asercion donde todo id de paciente debe existir en Animal o Humano... aqui todo OK... pero que pasaria con mi codigo? no estaria violando la asercion y esto nunca se ejecutaria...?

Espero su ayuda...
Muchas gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder