用于电影数据库搜索系统的SQL

时间:2010-09-11 11:10:09

标签: sql database-design

我正在建立一个电影数据库。每部电影都有场地类型,演员,导演等。现在我的问题是如何设计数据库并编写SQL,因为每部电影都可以有多个演员或导演等。

现在我的桌面电影数据库设计是:

  • movie_id
  • MOVIE_TITLE
  • actors_id
  • directors_id
  • genre_id

但是这样在电影中放入多个演员似乎更难。

4 个答案:

答案 0 :(得分:8)

演员与电影之间存在多对多的关系。每个演员都可以在很多电影中出演,每部电影都有很多演员。要在SQL中建模多对多关系,可以使用junction table(也称为交叉引用表,以及其他名称)。

+-------------+
| Movie       |
+-------------+
| Id          |<----+
| Title       |     |
| Year        |     |
+-------------+     |
                    |
+-------------+     |
| Actor       |     |
+-------------+     |
| Id          |<-+  |
| Name        |  |  |
| Birthdate   |  |  |
+-------------+  |  |
                 |  |
+-------------+  |  |
| Movie_Actor |  |  |
+-------------+  |  |
| ActorId     |--+  |
| MovieId     |-----+
+-------------+

要查询ID为153的电影中所有演员的姓名:

SELECT Actor.Name
FROM Actor
JOIN Movie_Actor ON Movie_Actor.ActorId = Actor.Id
WHERE Movie_Actor.MovieId = 153

答案 1 :(得分:0)

我最近回答了一个非常类似的问题。 (Entering a variable amount of data into a database with the best normalization possible

基本上,你需要完全分开所有项目,所以不要说你的电影包含演员,导演和流派 - 而是要有一个将它们链接在一起的表格。

因此,您将拥有一个包含movie_id和movie_title列的电影表,然后是一个将电影链接到actor的表,类似于MovieActors,其中包含movie_id和actor_id列。导演和流派也一样。

答案 2 :(得分:0)

因为演员可以出现在很多电影中,而电影会吸引很多演员,所以你需要实现多对多的关系。通常的方法是引入构建关系的第三个表。所以:

Movie:: movie_id(primary key); movie_title;
Actor:: actor_id(primary key); actor_name; 
Appears_in:: movie_id(foreign key); actor_id(foreign_key)

此Appears_in表可能将movie_id,actor_id作为其主键,和/或根据所需的访问单独和联合索引两列。

答案 3 :(得分:0)

这里的其他答案都是“正确的”,但有一点需要注意。即使您实现了桥接表,您也需要做更多工作。即说有一部电影在一段时间内有一位导演,然后改变了,等等等。

关键是,您需要确定应用程序的范围(在这种情况下和一般情况下)。它会处理什么类型的关系?一旦你决定了,那么你就可以实现一个合适的结构(也就是说,对于一个非常小的项目,你的建议结构可能是“正确的”,但对于另一种类型则不行。)

我所说的是,确定范围可以帮助您确定您的实施是否正确。坐下来判断你正在使用这个项目,然后采取适当的路线(可能是关系表)。