我试图建立一个数据库来存储和查询我的电影和情景喜剧。我希望能够查询各种(预定义)属性(例如演员,导演,长度)。 现在,并不是每部电影都扮演相同数量的演员,而且我不知道该怎么解释。
让我举个例子: 电影《快门岛》中的角色是里奥·迪卡普里奥(Leo DiCaprio)和马克·鲁法洛(Mark Ruffalo),而《盗梦空间》(Inception)中则是汤姆·哈迪(Tom Hardy),约瑟夫·戈登·莱维特(Joseph Gordon-Levitt),艾伦·佩奇(Ellen Page),里奥·迪卡普里奥(Leo DiCaprio)和迈克尔·坎恩(Michael Cane)。在“飞行员”中,只有DiCaprio独自一人(不准确,我知道)。
我可以添加很多属性,例如actor1,actor2,actor3等。但是当我用DiCaprio搜索电影时,我不知道他是在actor1,actor2中还是在他所处的actor-attribute中仍然,通过类似SELECT films FROM database WHERE actor = 'Leo DiCaprio'
的查询,我想获得数据库中所有他的电影的清单。
该数据库的合适设计是什么?关系数据库甚至可能做到这一点?
感谢您的帮助。也许遮篷很明显,但是我是sql和数据库的新手,出于培训目的,请尝试完成此操作。
答案 0 :(得分:1)
这是关系数据库的亮点!如下所示的模式为您提供了搜索方式和返回内容的灵活性。 要注意的重要一点是可用的一对多关系。电影可以有很多学分, 但单个信用必须属于特定电影。贡献者可以拥有许多信用类型和电影。他们甚至可以在电影中扮演许多角色。
Contributor
|---------------------|------------------|------------------|------------------|
| ContributorID | FirstName | LastName | DisplayName |
|---------------------|------------------|------------------|------------------|
| 1 | Leo | Dicaprio | Leo DiCaprio |
|---------------------|------------------|------------------|------------------|
| 2 | Kate | Winslet | Kate Winslet |
|---------------------|------------------|------------------|------------------|
| 3 | James | Cameron | James Cameron |
|---------------------|------------------|------------------|------------------|
Movie
|---------------------|------------------|
| MovieID | MovieName |
|---------------------|------------------|
| 1 | Titanic |
|---------------------|------------------|
Credit
|---------------------|------------------|------------------|------------------|
| CreditID | MovieID | ContributorID | CreditTypeID |
|---------------------|------------------|------------------|------------------|
| 1 | 1 | 1 | 1 |
|---------------------|------------------|------------------|------------------|
| 2 | 1 | 2 | 2 |
|---------------------|------------------|------------------|------------------|
| 3 | 1 | 3 | 3 |
|---------------------|------------------|------------------|------------------|
CreditType
|---------------------|------------------|
| CreditTypeID | CreditTypeName |
|---------------------|------------------|
| 1 | LeadingActor |
|---------------------|------------------|
| 2 | LeadingActress |
|---------------------|------------------|
| 3 | Producer |
|---------------------|------------------|
这是您执行原始请求的方式
SELECT MovieName FROM Movie m
JOIN Credit c ON c.MovieID = m.MovieID
JOIN Contributor co ON co.ContributorID = c.ContributorID
WHERE co.DisplayName = 'Leo DiCaprio'
您还可以找到电影中的所有字幕
SELECT m.MovieName, c.CreditTypeName, co.DisplayName
FROM Movie m
JOIN Credit c ON c.MovieID = m.MovieID
JOIN Contributor co ON co.ContributorID = c.ContributorID
JOIN CreditType ct ON ct.CreditTYpeID = c.CreditTypeID
WHERE m.MovieName = 'Titanic'
或者每当DiCaprio担任主演男主角
SELECT m.MovieName, c.CreditTypeName, co.DisplayName
FROM Movie m
JOIN Credit c ON c.MovieID = m.MovieID
JOIN Contributor co ON co.ContributorID = c.ContributorID
JOIN CreditType ct ON ct.CreditTYpeID = c.CreditTypeID
WHERE ct.CreditTypeName = 'LeadingActor'
AND co.DisplayName = 'Leo DiCaprio'
答案 1 :(得分:0)
您想要一个 association 表(也称为 junction )表,每个电影和每个演员一行:
MovieId ActorId
然后,您可以在给定的电影中列出想要的任何演员,每个演员在单独的行中。