none
Estructura de tablas Peliculas - Staff RRS feed

  • Pregunta

  • Hola

    Me gustaría poder representar información sobre películas y personas que hayan participado en ella, al estilo imdb. Y que si se realiza la búsqueda de una persona (o se hace click en su nombre), se muestren todas las películas en las que ha participado, fuera cual fuera su rol (actor, director, etc...)

    El caso es que no se qué estructura emplear para ello. He pensado tener una única tabla Peliculas, en la cual haya una columna por cada uno de los departamentos que participan en la misma, con el nombre de las personas separados por "comas". Por ejemplo:

    Tabla Pelicula

    Columna1: Produccion: persona 1, persona 2, persona 3...

    Columna2: Actores: persona 4, persona 2, persona 5...

    y así con cada departamento. ¿Es válida esta estructura? ¿Se haría mejor de otra manera?

    Si al querer mostrar la información de una persona (persona 2), ¿podría hacer una búsqueda y mostrar las películas en las que ha trabajado y su departamento?

    Gracias por la ayuda!

    jueves, 31 de enero de 2013 9:10

Respuestas

  • Cualquier estructura es "válida", pero tienes que vivir con las consecuencias de tus decisiones. En general, se recomienda aplicar a todo diseño de base de datos un procedimiento que se llama "normalización" y que consiste en eliminar de la estructura de la base de datos dependencias y relaciones potencialmente peligrosas.

    Lo que yo haría en tu lugar es lo siguiente:

    Pelicula (Pelicula_Id, Nombre, Fecha)

    Persona(Persona_Id, Nombre, Apellido, Fecha_Nacimiento)

    Rol(Rol_Id, Descripcion)

    Persona_Pelicula(Persona_Id, Pelicula_Id, Rol_Id)

    Con esta estructura, tu búsqueda se resume a un Select * from Pelicula P JOIN Persona_Pelicula PP On P.Pelicula_Id = PP.Pelicula_Id JOIN Rol R on PP.Rol:Id = R.Rol_Id WHERE PP.Persona_Id = @Persona_Id

    Esa consulta te dice todas las películas en que participó una persona y además te dice qué rol cumplió. La tabla de roles es la que va a contener "Actor", "Productor", ...


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    • Marcado como respuesta javier84 jueves, 31 de enero de 2013 12:03
    • Desmarcado como respuesta javier84 jueves, 31 de enero de 2013 12:49
    • Marcado como respuesta javier84 jueves, 31 de enero de 2013 12:51
    jueves, 31 de enero de 2013 11:07

Todas las respuestas

  • Cualquier estructura es "válida", pero tienes que vivir con las consecuencias de tus decisiones. En general, se recomienda aplicar a todo diseño de base de datos un procedimiento que se llama "normalización" y que consiste en eliminar de la estructura de la base de datos dependencias y relaciones potencialmente peligrosas.

    Lo que yo haría en tu lugar es lo siguiente:

    Pelicula (Pelicula_Id, Nombre, Fecha)

    Persona(Persona_Id, Nombre, Apellido, Fecha_Nacimiento)

    Rol(Rol_Id, Descripcion)

    Persona_Pelicula(Persona_Id, Pelicula_Id, Rol_Id)

    Con esta estructura, tu búsqueda se resume a un Select * from Pelicula P JOIN Persona_Pelicula PP On P.Pelicula_Id = PP.Pelicula_Id JOIN Rol R on PP.Rol:Id = R.Rol_Id WHERE PP.Persona_Id = @Persona_Id

    Esa consulta te dice todas las películas en que participó una persona y además te dice qué rol cumplió. La tabla de roles es la que va a contener "Actor", "Productor", ...


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    • Marcado como respuesta javier84 jueves, 31 de enero de 2013 12:03
    • Desmarcado como respuesta javier84 jueves, 31 de enero de 2013 12:49
    • Marcado como respuesta javier84 jueves, 31 de enero de 2013 12:51
    jueves, 31 de enero de 2013 11:07
  • Hola. Define una tabla llamada Película con campos como ID_Pelicula, Título, Año, Duración y Productora, por mencionar algunos. Luego define otra tabla llamada Actor con campos como ID_Actor, Nombre, Nacionalidad, Foto, Fecha_Nacimiento, por mencionar algunos. Y luego creas lo que se llama una tabla de relación para que puedas tener los actores por película; dicha tabla la puedes llamar Actor_Película y contiene dos campos, el ID_Pelicula y el ID_Actor.

    Así, cuando quieras saber que actor o actores participaron en una película, relacionas mediante un JOIN ambas tablas.

    SELECT Actor.ID AS Actor_ID, Actor.Actor, Actor.Foto, Pelicula.ID AS Pelicula_ID, Pelicula.Titulo, Pelicula.Año, Pelicula.Duración, Actor_Pelicula.Actor_ID, Actor_Pelicula.Pelicula_ID
    FROM Pelicula INNER JOIN (Actor INNER JOIN Actor_Pelicula ON Actor.[ID] = Actor_Pelicula.[Actor_ID]) ON Pelicula.[ID] = Actor_Pelicula.[Pelicula_ID];

    Por otra parte, IMDB ofrece un subconjunto de sus datos en http://www.imdb.com/interfaces en formato plano. Lo puedes descargar para llenar tu estructura o incluso, para facilidad y si solo quieres unos pocos datos, puedes usar este Web Service: http://deanclatworthy.com/imdb/

    Evalualo y nos cuentas, por favor.

    Saludos,


    Guillermo Taylor F.
    IT Pro & Xbox gamer
    My blog

    jueves, 31 de enero de 2013 11:13
  • Gracias por las respuestas.

    El caso, Guillermo, es que no solo quiero saber los actores, si no también equipo de producción, fotografía, etc...

    Voy a probar con la solución de Yván.

    "pero tienes que vivir con las consecuencias de tus decisiones"

    Por eso, no me gustaría empezar un desarrollo y tener que rehacerlo por una mala estructura :D

    Muchas gracias por la ayuda :)

    Saludos!

    jueves, 31 de enero de 2013 12:03