数据库具有不同数量的属性条目

时间:2019-04-09 18:26:25

标签: sql sqlite

我试图建立一个数据库来存储和查询我的电影和情景喜剧。我希望能够查询各种(预定义)属性(例如演员,导演,长度)。 现在,并不是每部电影都扮演相同数量的演员,而且我不知道该怎么解释。

让我举个例子: 电影《快门岛》中的角色是里奥·迪卡普里奥(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和数据库的新手,出于培训目的,请尝试完成此操作。

2 个答案:

答案 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

然后,您可以在给定的电影中列出想要的任何演员,每个演员在单独的行中。