sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo diseñar una base de datos de películas?

Tienes que hacer una distinción entre atributos y entidades. Una entidad es una cosa, generalmente un sustantivo. Un atributo es más como una pieza de información descriptiva. En la jerga de las bases de datos, entidad =tabla, atributo =campo/columna.

Tener una tabla separada para ciertas cosas, usemos director, como ejemplo, se llama normalizar. Si bien puede ser bueno en algunas circunstancias, puede ser innecesario en otras (ya que generalmente complica las consultas, tiene que unir todo, y es más lento).

En este caso, no es necesario tener una tabla de años, ya que no hay otros atributos sobre un año, además del año mismo, que almacenaría. Es mejor desnormalizar esto y almacenar el año en la propia tabla de películas.

El director, por otro lado, es diferente. Tal vez desee almacenar el nombre, apellido, fecha de nacimiento, fecha de muerte (si corresponde), etc. del director. Obviamente, no desea ingresar la fecha de nacimiento del director cada vez que ingresa una película que esta persona dirige, por lo que tiene sentido tener una entidad separada para un director.

Incluso si no desea almacenar toda esta información sobre el director (solo desea su nombre), es útil tener una tabla separada para él (y usar una clave sustituta; lo abordaré en un segundo) porque evita errores tipográficos y duplicados:si tiene el nombre de alguien mal escrito o ingresado de manera diferente (primero, último versus último, primero), entonces si intenta encontrar otras películas que haya dirigido, fallará.

El uso de una clave sustituta (clave principal) para las tablas suele ser una buena idea. Hacer coincidir un número entero es mucho más rápido que hacer coincidir una cadena. También te permite cambiar libremente el nombre, sin preocuparte por las claves foráneas almacenadas en otras tablas (el ID permanece igual, por lo que no tienes que hacer nada).

Realmente puedes llevar este diseño bastante lejos, y todo es cuestión de averiguar qué quieres poder almacenar en él.

Por ejemplo, en lugar de tener un solo director por película, algunas películas tienen varios directores... por lo que habría una relación de muchos a muchos entre películas y directores, por lo que necesitaría una tabla con, por ejemplo:

films_directors => **filmid, directorid**

Yendo un paso más allá, a veces los directores también son actores, y viceversa. Entonces, en lugar de tener mesas de director y actor, podría tener una mesa de una sola persona y unirse a esa mesa usando una tabla de roles. La tabla de roles tendría varias posiciones, por ejemplo, director, productor, estrella, extra, asistente, editor... y se vería más como:

films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**

También puede tener un campo role_details en la tabla film_people, que podría contener información adicional según el rol (p. ej., el nombre del papel que interpreta el actor).

También estoy mostrando el género como una relación de muchos<>muchos, porque es posible que una película esté en múltiples géneros. Si no quisieras esto, entonces en lugar de la tabla film_genre, las películas solo contendrían un ID de género.

Una vez que esto está configurado, es fácil consultar y encontrar todo lo que ha hecho una persona determinada, o todo lo que ha hecho una persona como director, o todos los que alguna vez han dirigido una película, o todas las personas involucradas en una película específica. Puede seguir y seguir.