elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Ayuda bbdd
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda bbdd  (Leído 1,834 veces)
Shester1996

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Ayuda bbdd
« en: 1 Noviembre 2019, 23:32 pm »

Ayuda :¬¬ ¿esta bien esta relacion 1 a 1?
Código
  1. CREATE TABLE profesor(
  2. id_profesor INT (10)NOT NULL,
  3. nombre VARCHAR(20),
  4. apellido VARCHAR(20),
  5. hora_aten TIME,
  6. curso_id_curso INT(10),
  7. PRIMARY KEY (id_profesor)
  8. );
  9.  
  10.  
  11. CREATE TABLE curso(
  12. id_curso INT (10)NOT NULL,
  13. nombre VARCHAR(20),
  14. duracion TIME,
  15. id_profesor INT (10),
  16. PRIMARY KEY (id_curso),
  17. FOREIGN KEY (id_profesor) REFERENCES profesor(id_profesor)
  18. );
  19.  

Edit del mod: agregando etiquetas de código.


« Última modificación: 20 Noviembre 2019, 00:59 am por Carloswaldo » En línea

JuanjoXD

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Ayuda bbdd
« Respuesta #1 en: 2 Noviembre 2019, 07:04 am »

Te falta ponerle un autoincremental a la PK de la tabla Profesor.
Si te animas a hacer una relación muchos a muchos tambien funcionaría mejor. Ya que un curso puede cambiar de profesor y tener así dos profesores  (ej.: suplente, titular, etc)


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda bbdd
« Respuesta #2 en: 2 Noviembre 2019, 17:43 pm »

Hola, te sugiero lo siguiente (esto está en postgres 10):

Código
  1. CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- as postgres user
  2.  
  3. CREATE TABLE teachers (
  4.    id bigserial NOT NULL PRIMARY KEY,
  5.    identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
  6.    name CHARACTER VARYING(32) NOT NULL,
  7.    last_name CHARACTER VARYING(32) NOT NULL,
  8.    attention TIME NOT NULL
  9. );
  10.  
  11. CREATE TABLE courses(
  12.    id bigserial NOT NULL PRIMARY KEY,
  13.    identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
  14.    name CHARACTER VARYING(32) NOT NULL,
  15.    duration TIME NOT NULL,
  16.    teacher_id BIGINT NOT NULL REFERENCES public.teachers(id) ON DELETE CASCADE ON UPDATE CASCADE
  17. );

Primero, no necesitas indicar el id del curso en la tabla del profesor, si llevas esto a la práctica no podrás crear la tabla profesores porque la tabla de cursos aun no existe y de todas maneras tampoco podrías ingresar un registro de profesor porque no existe el registro de curso y al reves, no puedes crear un curso porque no existe el profesor.

Segundo, debes declarar tus columnas si podrán estar nulos o no, esto es importante para mantener la integridad de la tabla.

Tercero, he agregado un identificador uuid para evitar exponer los id del lado del usuario y enumerar items, esto se considera una vulnerabilidad.

Cuarto, he utilizado bigint como id primario para aumentar la cantidad de registros soportados, esto añade escalabilidad a tu proyecto.

Quinto, he traducido las columnas y tablas al inglés, esto es una buena práctica, que tu sitio funcione con textos en español no quiere decir que el código deba estar en español, esto también ayuda en la escalabilidad del proyecto cuando necesites contratar a mas desarrolladores fuera de tu pais cuando el proyecto crezca.

Notas: Si te fijas, he mantenido el id separado del identificador, una opción hubiera sido utilizar únicamente el uuid como llave primaria pero esto aumentaría el coste de carga de la base de datos, por eso debes usar el id de manera interna para tus joins y el identificador para manipular desde tu front-end. La opción de cascada al eliminar se la puse para mantener la integridad de los datos, así si borran el profesor sus cursos también se eliminan ya que hemos declarado ese campo como no nulo, si quieres que el curso se mantenga entonces el campo debe ser nullable y la cascada debiera ejecutar un set null:

Código
  1. teacher_id BIGINT NULL REFERENCES public.teachers(id) ON DELETE SET NULL ON UPDATE CASCADE

Si te fijas, esta es una tabla de 1 a muchos, normalmente la tabla de 1 a 1 no debiera existir o no se debiera enseñar, pero en la práctica si es posible hacer esto aunque es un concepto complejo y útil en casos muy específicos, en tu caso no aplica, pero:

Una tabla de 1 a 1 quiere decir que un profesor sólo puede tener un curso y un curso sólo puede tener un profesor, esto en la práctica es imposible pero se puede solucionar de dos maneras: usando una tabla intermedia con dos llaves que les sean imposibles repetir o estableciendo el id del profesor de la tabla cursos como valor único.

Veamos:

Código
  1. teacher_id BIGINT NOT NULL REFERENCES public.teachers(id) UNIQUE ON DELETE CASCADE ON UPDATE CASCADE

De esta manera un profesor no podrá tener más de un curso y un curso no podrá tener más de un profesor, aunque esto es ridículo, pero esto sería de 1 a 1.

Será que tu profesor te ha querido gastar una broma?

Saludos.
« Última modificación: 2 Noviembre 2019, 17:57 pm por WHK » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda Con VB y BBDD
Programación Visual Basic
W0lFy 1 2,025 Último mensaje 15 Septiembre 2009, 12:02 pm
por W0lFy
Conexion BBDD ADO
Programación Visual Basic
W0lFy 7 5,433 Último mensaje 12 Abril 2010, 07:44 am
por W0lFy
Consejo GUI + BBDD
Programación General
AndyArmin 4 3,008 Último mensaje 27 Noviembre 2010, 14:57 pm
por AndyArmin
BBDD Gubernamentales
Hacking
sparrowise 5 3,692 Último mensaje 24 Noviembre 2011, 20:35 pm
por adastra
Conectarse a mi BBDD
Bases de Datos
Baal_30 0 2,513 Último mensaje 15 Junio 2015, 21:08 pm
por Baal_30
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines