如何用SQLite搭建一个电影评分数据库实战项目?

来源:编程网作者:南京GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何用SQLite搭建一个电影评分数据库实战项目?》,敬请观看详情。想把零散的电影打分记录整理成可查询的系统,直接建个SQLite库比用表格软件靠谱得多。SQLite零配置、单文件存储,非常适合个人或小团队做轻量数据管理。本文以一个电影评分数据库为例,说明怎么设计评分表、用户表和电影表,怎样用外键约束保证数据一致,以及如何写联表查询算出每部电影的平均分和评分人数。还会提到索引怎么加才合理,避免数据量大了之后查询变慢。跟着做完,你就能用一条SQL查出自己看过的片子谁打分高、哪类电影口碑最好。

在开发一个电影评分相关的应用时,很多人会纠结该选哪种数据库。对于单机工具、小型网站或者学习用途来说,SQLite是一个非常务实的选择。它不需要单独启动服务进程,整个数据库就是一个文件,拷贝走就能用。本文以一个完整的电影评分数据库实战项目为线索,从表结构设计、数据写入到复杂查询,带你把核心能力走一遍。

如何用SQLite搭建一个电影评分数据库实战项目?

数据库表结构设计与外键约束

电影评分系统的核心实体通常有三个:用户、电影、评分记录。用户表保存基本信息,电影表保存影片元数据,评分表则把前两者关联起来并记录分数。在SQLite中,虽然默认外键约束是关闭的,但我们可以在连接后执行PRAGMA foreign_keys = ON;来启用,从而防止出现指向不存在电影或用户的脏数据。

下面给出建表语句。注意评分表中的movie_iduser_id都通过REFERENCES指向对应主表,并设置了级联删除,这样当某部电影被删除时,相关评分也会自动清理,避免残留无效记录。

PRAGMA foreign_keys = ON;

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    created_at TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE movies (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    director TEXT,
    release_year INTEGER
);

CREATE TABLE ratings (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    movie_id INTEGER NOT NULL,
    score INTEGER NOT NULL CHECK (score >= 1 AND score <= 10),
    rated_at TEXT DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE
);

上面的CHECK约束保证分数只能在1到10之间,这是SQLite支持的表级约束能力。很多初学者以为SQLite只是轻量存储,其实它对约束、事务、视图的支持已经能满足绝大多数中小型项目。合理设计字段类型和约束,比后期写代码校验要可靠得多。

写入测试数据与事务批量插入

表建好之后,我们需要填充一些样例数据来验证查询逻辑。在真实项目中,评分往往是分散写入的,但演示时可以用事务一次性提交,既提升速度也保证原子性。SQLite的事务非常轻量,用BEGINCOMMIT包裹多条INSERT即可。

以下代码先插入两名用户和三部电影,再模拟他们各自的评分。通过事务包裹,如果中间某条语句失败,前面插入的内容也不会落盘,保持数据库干净。

BEGIN;

INSERT INTO users (username) VALUES ('alice'), ('bob');

INSERT INTO movies (title, director, release_year) VALUES
('星际穿越', '诺兰', 2014),
('千与千寻', '宫崎骏', 2001),
('盗梦空间', '诺兰', 2010);

INSERT INTO ratings (user_id, movie_id, score) VALUES
(1, 1, 9),
(1, 2, 8),
(2, 1, 10),
(2, 3, 7),
(1, 3, 9);

COMMIT;

插入完成后,可以执行简单查询确认数据完整性。比如SELECT * FROM ratings;能看到五条评分。这里要提醒一点,SQLite的AUTOINCREMENT会占用额外空间并记录最大ID,如果项目不需要严格递增,用INTEGER PRIMARY KEY即可,插入性能还会更好。实战中应根据业务取舍。

联表查询与评分统计实战

电影评分数据库最有价值的部分就是统计。我们常需要计算每部电影的平均分、评分人数,以及某个用户看过的所有电影及打分。这就要用到JOIN和聚合函数。SQLite完整支持INNER JOINLEFT JOIN以及GROUP BY

下面这条语句联表求出每部电影的平均分与评分次数,并按平均分降序排列。通过ROUND函数把平均分包两位,方便展示。

SELECT
    m.title,
    COUNT(r.id) AS rating_count,
    ROUND(AVG(r.score), 2) AS avg_score
FROM movies m
LEFT JOIN ratings r ON m.id = r.movie_id
GROUP BY m.id
ORDER BY avg_score DESC;

如果我们想看用户alice评价过的影片清单,可以把用户表和评分表、电影表三层连接。这种写法在报表类需求里极其常见,也是检验你是否掌握关系模型的关键。

SELECT
    u.username,
    m.title,
    r.score,
    r.rated_at
FROM users u
JOIN ratings r ON u.id = r.user_id
JOIN movies m ON r.movie_id = m.id
WHERE u.username = 'alice'
ORDER BY r.score DESC;

当数据量增长到几万条评分时,建议在ratings.movie_id上建索引,否则GROUP BY movie_id会全表扫描。可以用CREATE INDEX idx_ratings_movie ON ratings(movie_id);解决。SQLite的查询规划器会自动选用索引,不需要改SQL语句。掌握这些查询与优化手段,你的电影评分数据库就能从玩具变成真正可用的小系统。

SQLite电影评分数据库SQL查询修改时间:2026-08-14 10:27:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。