电影数据库搜索应用开发全解析
立即解锁
发布时间: 2025-08-30 01:26:19 阅读量: 12 订阅数: 31 AIGC 


掌握SQL:从入门到实践
### 电影数据库搜索应用开发全解析
#### 1. 示例应用概述
本示例应用是一个简单的电影数据库搜索程序,用于查找特定演员出演的电影。查询结果将以如下格式展示:
| 标题 | 国家, 发行年份 | 导演 | 演员 |
人员姓名将以逗号分隔的列表形式呈现。尽管描述简单,但实际编写的程序往往比教程中常见的示例复杂得多。在考虑使用宿主语言(向数据库发送 SQL 语句的语言)进行操作之前,我们先来探讨如何根据用户输入的条件得出最终结果。
#### 2. 获取结果
初学者常犯的错误是过于关注最终展示内容,一开始就思考“如何构建这些姓名列表”。实际上,这并非首要任务,尽管 SQL 可能带来挑战,但并非一定要在 SQL 中解决。初学者通常会尝试编写一个查询,将基础表转换为看起来符合预期的结果集,然后筛选出所需的行。
SQL 开发的一个难点在于,在小型数据库中,几乎任何方法都可能奏效,错误的方法也很少看起来明显错误。例如,创建一个返回所需电影信息的视图,并对视图中的演员列表应用带有 `like` 条件的 `where` 子句,在过滤时不会使用任何索引,但只要数据库规模不大,查询仍能正常工作。然而,当数据库变得非常大时,查询速度会变得极其缓慢。这种情况在专业开发中很常见,比如开发者仅在小数据集上测试查询,或者独自开发数据库时。当应用在小数据集或少量用户情况下运行良好,但在大数据集且多用户同时访问时变得迟缓,我们通常说它“扩展性不佳”(有些人会很快指责数据库,而不是编程本身)。
我们真正需要的是一个不会展示给最终用户的内容:电影 ID(movieid)列表。只要提供电影 ID,即使是对 SQL 有初步了解的人也能轻松获取该电影的标题、国家名称、发行年份、导演和演员信息。虽然可能需要更多查询,但我们能够得到所需信息。真正的难点不在于获取围绕电影 ID 的所有信息,而在于找到电影 ID。
电影 ID 是某人出演电影的标识符。只要知道人员的标识符,我们就能在 `credits` 表中轻松找到相关信息。因此,真正的挑战是根据输入的姓名(不一定与数据库中存储的格式相同)检索人员的标识符,其他都是次要的。
#### 3. 人员姓名搜索问题
在面向大众的程序中,通常不会要求用户分别输入名字和姓氏,单个“搜索框”是网站常见的功能,普通用户更习惯在一个输入框中输入全名。除了 C# 示例展示“分别输入姓氏和名字”(但假设用户可能输入错误)外,其他示例都使用单个输入框。
一般来说,程序对最终用户越简单,编码就越困难。输入全名的简单要求可能会带来很多麻烦。例如,用户输入“Clint Eastwood”,程序需要将这个字段拆分,并将每个部分与 `people` 表中的 `first_name` 和 `surname` 列进行匹配。但实际情况中,人名的格式多种多样,如“Edward G. Robinson”“Jamie Lee Curtis”“Benicio Del Toro”等,还有中文人名“Chow Yun - Fat”“Gong Li”等,他们的姓名顺序可能与西方人名不同。
在示例程序中,假设姓名可能不完整(如“Eastwood”),或者名字和姓氏顺序可能颠倒,但其他方面输入正确,不考虑拼写错误的情况,有重音的字母如果没有输入重音则无法匹配。我们主要关注如何将输入与数据库中的多个列进行匹配,并找到最佳匹配。
当全名包含两个以上以空格分隔的部分时,确定如何拆分并不容易。以下是几种不同的搜索策略:
- **策略一:按空格拆分全名并分别匹配**
将用户输入的全名按空格拆分,然后将每个部分分别与 `first_name` 和 `surname` 进行比较。例如,用户输入“Jamie Lee Curtis”,可以使用以下条件:
```sql
where ((first_name = 'Jamie' or surname = 'Jamie')
or (first_name = 'Lee' or surname = 'Lee')
or (first_name = 'Curtis' or surname = 'Curtis'))
```
这种方法将全名的每个部分作为一个标签,但会返回很多无关数据,如 Jamie Lee 的父亲 Tony Curtis、Jamie Foxx 等。因此,我们需要对满足条件的行按相关性进行排序。即使是更简单的名字,如“James Stewart”,使用类似条件也会返回无关结果,如 James Cagney、James Cameron 和 Stewart Granger。
为了对结果进行排序,我们可以使用一个计分表达式。例如,使用 `replace()` 函数从找到的姓名组合中移除输入的名字,然后检查剩余部分的长度:
```sql
coalesce(
length(
trim(
```
0
0
复制全文
相关推荐









