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:
Para las restricciones de integridad:
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:
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!!
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


0