You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电视剧季集发布的SQL数据库结构设计咨询及优化建议

电视剧数据库设计方案(适配按季管理需求)

作为经常帮人梳理数据库结构的开发者,我给你设计一个既符合数据库设计规范、又适合新手上手的方案,完美解决你想给每一季单独配置信息和海报的需求。核心思路是拆分三个核心数据表,通过外键建立关联,避免冗余数据,同时让PHP逻辑更清晰。

核心数据表设计

1. 电视剧主表(tv_shows)

存储整部电视剧的基础信息,所有季和剧集都关联到这个表:

  • tv_show_id:主键(自增整数),唯一标识一部剧
  • title:电视剧名称(比如《绝命毒师》)
  • cover_image:整部剧的主封面(可选,和季海报区分开)
  • description:整部剧的总简介
  • first_air_date:首播日期
  • status:播出状态(比如完结/连载中)
  • created_at:数据创建时间(可选,用于记录入库时间)

2. 季信息表(seasons)

这就是你需要的「每一季单独配置信息」的核心表,关联到电视剧主表:

  • season_id:主键(自增整数)
  • tv_show_id:外键,关联tv_shows的tv_show_id,表示这一季属于哪部剧
  • season_number:季数(比如1、2、3,用于排序和展示)
  • season_title:季的副标题(可选,比如《绝命毒师 第五季:最终章》)
  • poster_url:季专属海报的存储路径/URL(这就是你要的单独海报)
  • season_description:这一季的专属简介(比如“老白与汉克的最终对决”)
  • air_date:这一季的首播日期
  • episode_count:该季总集数(可选,也可以通过剧集表统计得到)

3. 剧集表(episodes)

存储每一集的具体信息,关联到对应季:

  • episode_id:主键(自增整数)
  • season_id:外键,关联seasons的season_id,表示这一集属于哪一季
  • episode_number:集数(比如1、2、3,用于排序)
  • episode_title:单集标题(比如“奥兹曼迪亚斯”)
  • runtime:单集时长(比如45,单位分钟)
  • episode_description:单集简介
  • air_date:单集播出日期
  • video_url:播放链接(或者存储路径)

为什么这样设计?

  • 完全符合数据库第三范式,避免冗余:比如季的海报不用重复存在每一集数据里,只存一次在seasons表,查询时关联即可
  • 逻辑清晰:从电视剧→季→剧集,层级关系明确,PHP里查询数据时非常好处理
  • 扩展性强:以后想加演员、分类、评分功能,只需要新增关联表就行,不会影响现有结构

PHP中常见操作示例

1. 查询某部剧的所有季(带海报)

// 假设你要查询ID为1的电视剧的所有季
$tv_show_id = 1;
// 使用PDO(推荐新手用PDO,更安全)
$pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码');

$query = "SELECT * FROM seasons WHERE tv_show_id = ? ORDER BY season_number ASC";
$stmt = $pdo->prepare($query);
$stmt->execute([$tv_show_id]);
$seasons = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 遍历输出季信息和海报
foreach ($seasons as $season) {
    echo "<h3>第{$season['season_number']}季:{$season['season_title']}</h3>";
    echo "<img src='{$season['poster_url']}' alt='第{$season['season_number']}季海报'>";
    echo "<p>{$season['season_description']}</p>";
}

2. 查询某一季的所有剧集

// 假设要查询ID为5的季的所有剧集
$season_id = 5;

$query = "SELECT e.*, s.season_number FROM episodes e 
          JOIN seasons s ON e.season_id = s.season_id 
          WHERE e.season_id = ? 
          ORDER BY episode_number ASC";
$stmt = $pdo->prepare($query);
$stmt->execute([$season_id]);
$episodes = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 输出剧集列表
foreach ($episodes as $episode) {
    echo "<p>第{$episode['season_number']}季第{$episode['episode_number']}集:{$episode['episode_title']}</p>";
    echo "<p>时长:{$episode['runtime']}分钟</p>";
}

新手注意事项

  • 记得给外键字段设置索引,这样关联查询时速度会更快
  • 存储图片时,建议存相对路径(比如/posters/breaking-bad-s5.jpg),不要存绝对URL,方便以后换域名或存储位置
  • 如果用MySQL,建表时记得设置字符集为utf8mb4,避免中文乱码

内容的提问来源于stack exchange,提问作者Sejoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:42:52