sql - 具有不同数量的属性条目的数据库
问题描述
我尝试建立一个数据库来存储和查询我的电影和情景喜剧。我希望能够查询各种(预定义)属性(例如演员、导演、长度)。现在,并不是每部电影都有相同数量的演员出演,我不知道如何解释这一点。
让我举个例子:在电影《Shutter Island》中,里奥·迪卡普里奥和马克·鲁法洛扮演,在《盗梦空间》中,汤姆·哈迪、约瑟夫·高登-莱维特、艾伦·佩奇、里奥·迪卡普里奥和迈克尔·坎恩扮演。在飞行员中只有迪卡普里奥(不准确,我知道)。
我可以添加很多属性,比如actor1、actor2、actor3……但是当我在搜索DiCaprio 的电影时,我不知道他是在actor1、actor2 中还是他在哪个actor 属性中。不过,使用类似于SELECT films FROM database WHERE actor = 'Leo DiCaprio'
我想在我的数据库中获取包含他所有电影的列表的查询。
数据库的合适设计是什么?这甚至可以使用关系数据库吗?
谢谢你的帮助。也许 awnser 很明显,但我是 sql 和数据库的新手,并尝试完成此操作以用于培训目的。
解决方案
这就是关系数据库大放异彩的地方!像下面这样的架构为您提供了搜索方式和返回内容的灵活性。需要注意的重要一点是可用的一对多关系。一部电影可以有许多学分,但一个学分必须属于特定电影。一个贡献者可以有许多信用类型和电影。他们甚至可以在一部电影中扮演许多角色。
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'
推荐阅读
- c# - 提供数据到
xml xml 对于 C# Web 服务 - java - 更改抽屉布局项目
- android - 在黑白之间切换状态栏文本颜色
- css - 结合 vue 材料和 vue cli webpack 模板时,表单元素显示为透明
- angular - Angular 6 - 从 ReactiveForm 访问数组中的数组
- android - 启用在地图框上显示高尔夫球车路径以及行驶路径
- amazon-web-services - 我的应用所在的区域对 Amazon SES 免费套餐是否重要?
- reflection - 我可以在纯 Kotlin 中通过类名实例化一个对象吗
- assembly - 如何使用 malloc 空间执行代码而不是存储数据
- javascript - 使用 Jest 测试 DOMParser