MySQL - Problema con llaves foraneas

   
Vista:
Imágen de perfil de jesus

Problema con llaves foraneas

Publicado por jesus jj.tecan@gmail.com (4 intervenciones) el 27/02/2015 23:44:09
Hola espero se encuentren muy bien, soy nuevo en este foro, al igual que mysql, miren lo que pasa es que tengo que realizar como proyecto de practica un control escolar con las siguientes tablas:
*usuarios
*alumnos
*docentes
*materia
*cargaAcademica

las primeras cuatros ya las tengo, si pude relacionarlas, ya lo implemente y probe insertando registros, tanto en la tabla usuarios, materias y en la de alumnos, tambien implemente la tabla docente y tambien ha corrido bien, ahora voy con la tabla carga, como podria realizarla es que me piden que tenga:
id_carga auto_increment(no tengo problema)
alu---nombre del alumno referenciado al nombre de algun alumno registrado (problema)
doc--nombre de docente referenciado al nombre de un docente registrado(problema)
materia-nombre de materia registrada(no tengo problema)
fecha_inicio--cuando inicio el curso(no problema)
calificacion int---para asignar un calificacion una vez terminado el curso...(no tengo problema)

Y que yo sepa las claves foraneas hacen referencia a claves de otra tabla, incluso no he podido referencias a otro campo, pude referencias el nombre de la materia en la tabla carga con el nombre en la tabla materia porque era UNIQUE,ninguna materia se puede repetir, me surge la idea de poner unique tanto el nombre del docente, como el del alumno pero suena ilogico, ya que pueden hacer mas docentes y alumnos con el mismo nombre......¿ tendre que cambiar la estructura de mi BD?, acepto sugerencias y recomendaciones, les dejo el código y espero que me puedan ayudar.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
create table usuarios(
id_usuario int auto_increment not null primary key,
login varchar(20) not null,
clave varchar(16) not null,
nivel varchar(20) not null,
unique (login)
) engine = innodb;
 
create table materia(
id_materia int auto_increment not null primary key,
nombre varchar(30) not null,
duracion date not null,
unique (nombre)
) engine = innodb;
 
 
create table alumno(
id_alumno varchar(11) primary key ,
nombre varchar(20) not null,
apellidos varchar(40) not null,
direccion varchar(30) not null,
telefono int,
email varchar(40),
login_alu varchar(20) not null,
clave_alu varchar(16) not null,
materia_alu varchar(30) not null,
foreign key(login_alu) references usuarios(login) on update cascade on delete cascade,
foreign key(materia_alu) references materia(nombre) on update cascade on delete cascade
) engine = innodb;
 
create table docente(
id_docente varchar(11) primary key ,
nombre varchar(20) not null,
apellidos varchar(40) not null,
direccion varchar(30) not null,
telefono int,
email varchar(40),
login_doc varchar(20) not null,
clave_doc varchar(16) not null,
materia_doc varchar(30) not null,
foreign key(login_doc) references usuarios(login) on update cascade on delete cascade,
foreign key(materia_doc) references materia(nombre) on update cascade on delete cascade
) engine = innodb;
 
 
create table carga(
id_carga int auto_increment primary key,
alu varchar(11) not null,
doc varchar(11) not null,
mat varchar (30)not null,
fecha_inicio date,
calificacion int,
foreign key(alu) references alumno(id_alumno) on update cascade on delete cascade,
foreign key(doc) references docente(id_docente) on update cascade on delete cascade,
foreign key(mat) references materia(nombre) on update cascade on delete cascade
) engine innodb;

Saludos desde mexico!!....
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
Imágen de perfil de jesus

Problema con llaves foraneas

Publicado por jesus (4 intervenciones) el 28/02/2015 00:12:49
He seguido leyendo, y buscando informacion alterna, y he resolvido que esta bien mi tabla, solo son las consultas que deben de cambiar: ejemplo
select *
from materia t, docentes p
where t.nombre = p.id_nombre

igual si ustedes tienen otras alternativas a mi base de datos, aceptaria las sugerencias....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con llaves foraneas

Publicado por SuperIndio (35 intervenciones) el 02/03/2015 17:18:27
Bueno ante que todo... del diseño global está bueno, pero a la
hora de la referencia, al menos yo no recomiendo el "AutoIncrement"
para aquellas Columnas (Id, Indicador, Codigo, etc. etc..) que
van a ser referenciadas.

La opcion UNIQUE te sirve solo aclaratoria, o que te genere un error al cargar o para chekar
yo el control lo hago por codigo, cuando cargo un nombre, busco si existe algo igual o parecido
de manera que no uso UNIQUE

Otra observacion que te hago es que en la tabla alumno
pusiste la columna
materia_alu varchar(30) not null,
si vas a cargar las materia alli, tendria que repetir el mismo alumno varias veces (id_alumno)
la password del alumno para que ?

sqlite3 TAlumnodb.db3 < tAlumn.sql

c:\Mariadb\bin\mysql -h localhost -u root < tAlumn.sql


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
CREATE DATABASE IF NOT EXISTS TAlumnodb;
 
USE TAlumnodb;
 
Drop Table Usuarios ;
 
Create Table Usuarios (
Coduser         Varchar(20)        Not Null ,
Passusr         Varchar(16)        Not Null ,
Nivel           Varchar(20)        Not Null Default 'Consultor' ,
Primary Key ( Coduser ) );
 
Drop Table Docente ;
 
Create Table Docente (
Id_docente      Varchar(16)        Not Null ,
Nombre          Varchar(20)        Not Null ,
Apellidos       Varchar(40)        Not Null ,
Direccion       Varchar(30)        Not Null Default ' ' ,
Telefono        Integer            Not Null Default 0   ,
Email           Varchar(40)        Not Null Default ' ' ,
Coduser         Varchar(20)        Not Null References Usuarios( Coduser ) On Update Cascade On Delete Cascade ,
Primary Key ( Id_docente ) ) ;
 
Drop Table Materia ;
 
Create Table Materia (
Id_materia      Int Auto_increment Not Null ,
Nombre          Varchar(30)        Not Null,
Duracion        Date               Not Null,
Id_docente      Varchar(16)        Not Null References Docente(Id_docente) On Update Cascade On Delete Cascade ,
Primary Key( Id_materia ) ) ;
 
Drop Table Alumno ;
 
Create Table Alumno (
Legajo          Varchar(16)        Not Null Default ' ' ,
Apellido        Varchar(40)        Not Null Default ' ' ,
Nombre          Varchar(20)        Not Null Default ' ' ,
Direccion       Varchar(30)        Not Null Default ' ' ,
Telefono        Integer(12)        Not Null Default 0   ,
Email           Varchar(40)        Not Null Default ' ' ,
Coduser         Varchar(20)        Not Null References Usuarios(Coduser) On Update Cascade On Delete Cascade ,
Primary Key( Legajo ) ) ;
 
Drop Table MatAlumno ;
 
Create Table MatAlumno (
Legajo          Varchar(16)        Not Null References Alumno (Legajo    ) On Update Cascade On Delete Cascade ,
Id_materia      Int                Not Null References Materia(Id_materia) On Update Cascade On Delete Cascade ,
Fecha_inscrip   Date               not Null ,
Estado          Smallint           Not Null Default 0   ,
Primary Key( Legajo, Id_materia ) ) ;
 
Drop Table Calificaciones ;
 
Create Table Calificaciones (
Legajo          Varchar(16)        Not Null References Alumno (Legajo    ) On Update Cascade On Delete Cascade ,
Id_materia      Int                Not Null References Materia(Id_materia) On Update Cascade On Delete Cascade ,
Fecha_alta      Date               Not Null ,
Calificacion    Smallint           Not Null Default 0   ,
Primary Key( Legajo, Id_materia, Fecha_alta ) ) ;
 
Commit;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de jesus

Problema con llaves foraneas

Publicado por jesus (4 intervenciones) el 03/03/2015 02:04:31
Antes que nada espero que estes bien y te agradezco el que estes cometando y dando sugerencias SuperIndio, muy bien deja te exlico:
El auto_increment lo utilizo para llevar un conteo del numero de usuarios ascendetemente, con varchar seria similar, solo que en mi caso me es mas facil buscar mediante un numero que buscar por un cadena de texto, pero tomare en cuenta su sugerencia, ahora la opcion UNIQUE la utilize porque estoy trabajando con INNODB, en llaves foraneas,habia hecho llaves compuestas, pero me generaba mucho error al utilizar las llaves foraneas, decidi poner una clave primaria al identificador y utilizar "Login" como UNIQUE,para al hacer las consultas o buscar lo hago con la clave principal, y el login como es unico no se podra repetir el usuarios, en cambio dos usuarios pueden tener la misma clave pero no el usuario.

Sobre la tabla alumno, ya la modifique y ciertamente estaba en el error que tu mencionaste:
"pusiste la columna materia_alu varchar(30) not null si vas a cargar las materia alli, tendria que repetir el mismo alumno varias veces (id_alumno)
la password del alumno para que ?"

Esa columna fue retirada:
1
2
3
4
5
6
7
8
9
10
11
create table alumno(
id_alumno varchar(11) primary key ,
nombre varchar(20) not null,
apellidos varchar(40) not null,
direccion varchar(30) not null,
telefono varchar(20) not null,
email varchar(40),
login_alu varchar(20) not null,
clave_alu varchar(16) not null,
foreign key(login_alu) references usuarios(login) on update cascade on delete cascade
) engine = innodb;

El password del alumno lo utilizo para que ingrese al sistema para poder consultar materias de la institucion, o para ver su calificacion una vez que esta se encuentra asignada. Gracias y saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con llaves foraneas

Publicado por SuperIndio (35 intervenciones) el 10/03/2015 15:44:45
Bueno me alegro...que haya aclarado y corregido tu diseño... y comento a tener en cuenta
Si bien MySQL/mariaDb o postgresSQL ofrecen una enorme flexibilidad y diversidad en el lenguaje... su uso execesivo en controles etc etc puede traer... algun que otro dolor de cabeza... mas aun si algun dia tenes que migrar... y/o modificar la estructura... lo que vale mas (y esto me dice la experiencia) es el buen diseño y la normalizacion (formas normales)... un diseño bien hecho en el futuro te ahorra un monton de tiempo.... Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar