Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Schema Designer (https://www.clubdelphi.com/foros/showthread.php?t=82061)

donpedro 22-01-2013 15:25:39

Schema Designer
 
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

Cita:

Empezado por ozsWizzard (Mensaje 453828)
[...] 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

Cita:

Empezado por Al González (Mensaje 453833)
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.

Cita:

Empezado por ozsWizzard (Mensaje 453839)
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,

Cita:

Empezado por Al González
Por ello es que siempre se recomienda controlar estas situaciones mediante Integridad Referencial a nivel de la base de datos...

Cita:

Empezado por Casimiro Notevi
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:
Cita:

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

2- Manual de Integridad Referencial en MySQL - Clases Personales
http://www.google.com/url?sa=t&rct=j...rHajSA&cad=rja

3- Claves foráneas (foreign keys)
http://dev.mysql.com/doc/refman/5.0/...eign-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

Código SQL [-]
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;

Código SQL [-]
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;


La franja horaria es GMT +2. Ahora son las 12:04:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi