alanezz / Syllabus-2019-1

26 stars 13 forks source link

[BCNF] - Foreign Keys #42

Closed VicenteVicente closed 5 years ago

VicenteVicente commented 5 years ago

¿Es permitido por BCNF utilizar Foreign Keys? Lo quiero hacer específicamente en una relacion 1:N

valerojasm commented 5 years ago

Hola, claro! Las llaves foráneas no son restringidas, es más, son muy necesarias ya que son un atributo que se encarga de relacionar una tupla con otra de alguna otra tabla - y eso ya lo tienes en varias de las que les fueron entregadas.

Por ejemplo, para normalizar esquemas a veces necesitas crear tablas intermedias, como el ejemplo que vieron hace un tiempo en clases: Películas y Actores están relacionadas a través de la tabla Actuo_en, la que tenía el id de una película y de un actor que trabajó en ella en cada una de sus filas. Ahí puedes ver el uso de foreign keys en un esquema normalizado.

Saludos!

Faalfaro commented 5 years ago

Hola, con respecto a esto, ese es un ejemplo donde Películas y Actores tienen relación N:N, pero en el caso en que hipotéticamente un actor solo pueda actuar en una película en su vida (relación 1:N), si hago uso de Foreing Key dentro de la tabla Actores para referirme a la tabla Películas ¿eso se considera normalizado? ¿o ni siquiera se necesita usar Foreing Key en este caso y ya estaría normalizado? Saludos!

VicenteVicente commented 5 years ago

Disculpa, creía que los atributos de Actuo_en debía tener como primary key la tupla pid y aid, pero según lo que me dices, ¿deberían ser Foreign Key? Saludos!

valerojasm commented 5 years ago

@VicenteVicenteVicenteVicenteVicente Ni pid ni aid serían primary key, ya que ninguno es único si la relación es N:N - ambas son foreign keys ya que pid hace referencia a una película de la tabla Películas y aid a un actor de la tabla Actores.

@Faalfaro Claro, en caso de que fuera 1:N no tendría sentido hacer una tabla intermedia, en ese caso basta con que cada actor tenga la única película en la que ha actuado como foreign key. Si estamos hablando netamente de este atributo, sí estaría normalizado, pero depende de qué otra información contengan tus tablas. Se entiende?

Saludos!

VicenteVicente commented 5 years ago

Clarísimo!, muchas gracias 😃

nivek0o0 commented 5 years ago

@VicenteVicenteVicenteVicenteVicente Creo que Valentina no te endendió y pensó que te referías a pid y aid como primary keys por separado o algo así. Sucede que como tupla sí es válido que sean Primary Key, ya que esa restricción evitará que se inserten filas repetidas en la tabla intermedia.

En general, una tabla intermedia se ve de la siguiente forma: Captura de pantalla de 2019-04-14 17-13-54

Aunque también tienes cmo alternativa agregar una 3ra columna que corresponda a un id único.

Saludos!

VicenteVicente commented 5 years ago

Entonces, si tengo una tabla Actuo_en con TAN SOLO LAS COLUMNAS pid (Película id) y aid (Actor id), ¿estas deben ser PRIMARY KEY como tupla (pid, aid) y FOREIGN KEY por separado (aid REFERENCES Actores(aid) y pid REFERENCES Peliculas(pid))?

nivek0o0 commented 5 years ago

No es obligación, pero es una buena práctica que evitará que insertes filas repetidas y que luego al hacer JOINs se obtenga información duplicada.

VicenteVicente commented 5 years ago

Ahora sí, gracias! 😄

valerojasm commented 5 years ago

@VicenteVicenteVicenteVicenteVicente Sí, no te había entendido, perdón! Como dice @nivek0o0 es una buena práctica, puedes dejarla tal como está pero después podrías tener información redundante (a no ser que, dependiendo de tu consulta, uses distinct por ejemplo). En el ejemplo que te dio hace exactamente lo que dijiste :) Saludos!

VicenteVicente commented 5 years ago

Gracias!!!