我正在建立一个电影数据库。每部电影都有场地类型,演员,导演等。现在我的问题是如何设计数据库并编写SQL,因为每部电影都可以有多个演员或导演等。
现在我的桌面电影数据库设计是:
但是这样在电影中放入多个演员似乎更难。
答案 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)
这里的其他答案都是“正确的”,但有一点需要注意。即使您实现了桥接表,您也需要做更多工作。即说有一部电影在一段时间内有一位导演,然后改变了,等等等。
关键是,您需要确定应用程序的范围(在这种情况下和一般情况下)。它会处理什么类型的关系?一旦你决定了,那么你就可以实现一个合适的结构(也就是说,对于一个非常小的项目,你的建议结构可能是“正确的”,但对于另一种类型则不行。)
我所说的是,确定范围可以帮助您确定您的实施是否正确。坐下来判断你正在使用这个项目,然后采取适当的路线(可能是关系表)。