PDA

Ver la Versión Completa : Schema Designer


donpedro
22-01-2013, 15:25:39
hola que Dios me los bendiga a todos....
estoy realizando un sistema en delphi 2009 con MySql... mi pregunta es.

tengo una tabla llamada tutor, y una tabla llamada estudiante,, donde cada estudiante depende de un tutor

quiero controlar, que si el usuario desea eliminar un tutor, que salga un mensaje de error de que dicho tutor no se puede eliminar ya que tiene un estudiante inscrito

como podria hacer eso sin tener que crear un schema designer....espero haberme explicado

gracias de antemano por su colaboracion...

Casimiro Notevi
22-01-2013, 16:15:22
Si usas cualquier base de datos relacional (firebird, mysql, postgresql, etc..) no tendrías que hacer nada porque el sistema te avisaría (suponiendo que hayas diseñado correctamente la base de datos)

ozsWizzard
22-01-2013, 16:27:09
Y si quieres tenerlo controlado por aplicación... o interceptas la excepción o haces la select para ver que el "tutor" que tienes "estudiantes", en caso de que existan registros...

He de reconocer que no entiendo bien la pregunta, o es muy simple lo que preguntas o yo doy muchas cosas por hecho.

Al González
22-01-2013, 17:46:36
[...] o haces la select para ver que el "tutor" que tienes "estudiantes", en caso de que existan registros...
El problema con esta opción, sobre todo cuando a la base de datos se conectan varios clientes, es que inmediatamente después de hacer un Select que trajera como resultado 0 estudiantes, en la base de datos otro usuario / aplicación podría agregarle estudiantes a ese tutor, justo antes de admitirse la orden de borrado.

Por ello es que siempre se recomienda controlar estas situaciones mediante integridad referencial a nivel de la base de datos, que es a lo que alude Casimiro. Es decir, diseñar bien las llaves externas ("foráneas") para impedir que un registro de tutor pueda ser eliminado si tiene relacionados registros de estudiantes.

Saludos. :)

ozsWizzard
22-01-2013, 18:47:19
¡Correctísimo!

Hablaba de opciones, no de cuales son mejores o peores.

De todas formas, no siempre lo mejor es establecer una relación entre tablas, hay que examinar siempre que entorno te vas a encontrar (nº de usuarios a la vez, tipo de relación, gestión de bloqueos,...)

Pero vamos, a grosso modo tienes toda la razón. :)

Casimiro Notevi
22-01-2013, 18:59:10
Por ello es que siempre se recomienda controlar estas situaciones mediante integridad referencial a nivel de la base de datos, que es a lo que alude Casimiro. Es decir, diseñar bien las llaves externas ("foráneas") para impedir que un registro de tutor pueda ser eliminado si tiene relacionados registros de estudiantes.

De todas formas, no siempre lo mejor es establecer una relación entre tablas...

La mejor opción es establecer la relación entre tablas, tal y como te hemos comentado Al González y yo.

nlsgarcia
22-01-2013, 20:21:22
donpedro,


Por ello es que siempre se recomienda controlar estas situaciones mediante Integridad Referencial a nivel de la base de datos...



La mejor opción es establecer la relación entre tablas, tal y como te hemos comentado Al González y yo.

La Integridad Referencial es la opción adecuada como bien lo comentan Casimiro y Al González, garantizando la consistencia de la data independientemente de la aplicación a través del Motor de BD.

Revisa estos links:

1- Crear Foreign Key (Integridad Referencial) con MySQL
http://www.bibigeek.com/2009/08/30/crear-foreign-key-con-mysql/

2- Manual de Integridad Referencial en MySQL - Clases Personales
http://www.google.com/url?sa=t&rct=j&q=mysql%20y%20integridad%20referencial&source=web&cd=9&ved=0CHMQFjAI&url=http%3A%2F%2Fclasespersonales.com%2Fmanual_integridad_referencial_en_mysql.pdf&ei=WuH-ULC-GNKu0AHxg4DABg&usg=AFQjCNHsgoWCt-SHiShq9T5dXFYXrHajSA&cad=rja

3- Claves foráneas (foreign keys)
http://dev.mysql.com/doc/refman/5.0/es/ansi-diff-foreign-keys.html

4- Integridad referencial
http://es.wikipedia.org/wiki/Integridad_referencial

Espero sea útil :)

Nelson.

donpedro
22-01-2013, 22:47:44
hola de nuevo,,, me voy a explicar,, porque intente crear foreign key y en unas tablas me funciono pero en 2 tablas me dio error me explico....
tengo dos tablas una llamada estudiante y otra inscripcion, como lo muestro mas abajo, intente agregarle foreign key pero dio el siguiente error Can't create table 'sigeduc.#sql-9ec_1' (errno: 150),,,,que debo hacer,,, como hago para declarar indexes y foreign key correctamente

CREATE TABLE `estudiante` (
`TUTORID` varchar(7) NOT NULL,
`NOMBRETUTOR` varchar(30) DEFAULT NULL,
`MATRICULA` varchar(15) NOT NULL DEFAULT '',
`RNE` varchar(25) DEFAULT NULL,
`NOMBRES` varchar(30) DEFAULT NULL COMMENT 'nombre del estudiante',
`APELLIDOS` varchar(30) DEFAULT NULL COMMENT 'Apellidos del estudiante',
`FECHA DE NACIMIENTO` varchar(15) DEFAULT NULL COMMENT 'Fecha de nacimiento del estudiante',
`EDAD` varchar(5) DEFAULT NULL COMMENT 'Edad del estudiante',
`SEXO` varchar(15) DEFAULT NULL,
`INSTITUCION BECA` varchar(20) DEFAULT NULL COMMENT 'Institucion que le da beca a los estudiantes',
`CANTIDAD HERMANO` int(10) DEFAULT NULL COMMENT 'cantidad de hermano que tiene el estudiante',
`LUGAR ENTRE HERMANO` int(10) DEFAULT NULL COMMENT 'lugar que ocupa el estudiante dentro de sus hermanos',
`CONDICION ANO ESCOLAR` varchar(18) DEFAULT NULL COMMENT 'condicion del ano escolar promovido,nuevo',
`CONDICION ANO ESCOLAR1` varchar(15) DEFAULT NULL COMMENT 'condicion del ano escolar promovido,nuevo',
PRIMARY KEY (`TUTORID`,`MATRICULA`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `inscripcion` (
`ANO_ESCOLAR` varchar(20) NOT NULL,
`TUTORID` varchar(5) DEFAULT NULL,
`MATRICULA` varchar(15) NOT NULL,
`FECHA_INSCRIPCION` varchar(12) DEFAULT NULL,
`GRADO` varchar(30) DEFAULT NULL,
`SECCION` varchar(3) DEFAULT NULL,
`CARRERA` varchar(30) DEFAULT NULL,
`TANDA` varchar(11) DEFAULT NULL,
`TRANSPORTE` varchar(18) DEFAULT NULL,
`BECA` varchar(12) DEFAULT NULL,
`PORCIENTO` varchar(12) DEFAULT NULL,
`IDCONDICION` varchar(15) DEFAULT NULL,
`PAGARAMENSUAL` varchar(7) DEFAULT NULL,
`MONTOAPROBADO` varchar(7) DEFAULT '0',
`STATUS` char(1) DEFAULT NULL,
`FECHA_RETIRO` varchar(14) DEFAULT NULL,
PRIMARY KEY (`ANO_ESCOLAR`,`MATRICULA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;