Ayuda bbdd

Iniciado por Shester1996, 1 Noviembre 2019, 23:32 PM

0 Miembros y 1 Visitante están viendo este tema.

Shester1996

Ayuda :¬¬ ¿esta bien esta relacion 1 a 1?
Código (sql) [Seleccionar]
create table profesor(
id_profesor int (10)not null,
nombre varchar(20),
apellido varchar(20),
hora_aten time,
curso_id_curso INT(10),
primary key (id_profesor)
);


create table curso(
id_curso int (10)not null,
nombre varchar(20),
duracion time,
id_profesor int (10),
primary key (id_curso),
foreign key (id_profesor) references profesor(id_profesor)
);


Edit del mod: agregando etiquetas de código.

JuanjoXD

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)

WHK

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

Código (sql) [Seleccionar]
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- as postgres user

create table teachers (
   id bigserial NOT NULL PRIMARY KEY,
   identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
   name character varying(32) NOT NULL,
   last_name character varying(32) NOT NULL,
   attention time NOT NULL
);

create table courses(
   id bigserial NOT NULL PRIMARY KEY,
   identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
   name character varying(32) NOT NULL,
   duration time NOT NULL,
   teacher_id bigint NOT NULL REFERENCES public.teachers(id) ON DELETE CASCADE ON UPDATE CASCADE
);


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 (sql) [Seleccionar]
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 (sql) [Seleccionar]
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.