首页 > 解决方案 > 具有不同数量的属性条目的数据库

问题描述

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

让我举个例子:在电影《Shutter Island》中,里奥·迪卡普里奥和马克·鲁法洛扮演,在《盗梦空间》中,汤姆·哈迪、约瑟夫·高登-莱维特、艾伦·佩奇、里奥·迪卡普里奥和迈克尔·坎恩扮演。在飞行员中只有迪卡普里奥(不准确,我知道)。

我可以添加很多属性,比如actor1、actor2、actor3……但是当我在搜索DiCaprio 的电影时,我不知道他是在actor1、actor2 中还是他在哪个actor 属性中。不过,使用类似于SELECT films FROM database WHERE actor = 'Leo DiCaprio'我想在我的数据库中获取包含他所有电影的列表的查询。

数据库的合适设计是什么?这甚至可以使用关系数据库吗?

谢谢你的帮助。也许 awnser 很明显,但我是 sql 和数据库的新手,并尝试完成此操作以用于培训目的。

标签: sqlsqlite

解决方案


这就是关系数据库大放异彩的地方!像下面这样的架构为您提供了搜索方式和返回内容的灵活性。需要注意的重要一点是可用的一对多关系。一部电影可以有许多学分,但一个学分必须属于特定电影。一个贡献者可以有许多信用类型和电影。他们甚至可以在一部电影中扮演许多角色。

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'

或者每次迪卡普里奥都是主角

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'

推荐阅读