跳到课程正文
EN
课程书架/自学公开课程

第 04 周 / 24 · 理解基础

让记录可信

让记录可信:SQL、关系、约束与迁移

10 小时核心 + 2 小时机动学习 · 实验 · 独立练习
开始阅读 ↓
让记录可信24 周个人 FDE 实践路线

本周要回答: 当数据积累到几十条或几百条,你能说明每个数字从哪里来,重复和缺失怎样处理吗?

进入本周前: 理解对象、数组、输入校验和基本 Git;能够分辨“原始数据”与“计算结果”。

图 04.1本周的思考路径
  1. 01定义数据粒度
  2. 02约束写入
  3. 03查询与核对
  4. 04迁移与恢复
课程示意图 · 根据本周实验步骤绘制,表示建议流程,不是实测结果。

学习内容与理解目标

本周以本地 SQLite 或另一种已了解的关系数据库学习数据建模。先定义一行代表什么,再考虑表怎么关联。掌握主键、外键、非空、唯一约束、查询条件、排序、聚合和基本连接;学会区分零、未知和不适用。数据库查询本身不复杂,真正容易出错的是把不同粒度的数据混在一起。

建议使用两个简单实体:任务与运行记录。一项任务可以有多次运行,失败运行也需要记录。还应理解事务与迁移:多个有关联的写入不能只成功一半;修改字段要有版本和恢复路径。本周只用合成数据,不搭一个云端分析平台。

学习链接与选读范围

级别 官方或原始资料 本周只读这些 阅读预算
必读 R18 · CS50 SQL Week 0:Querying 筛选、排序与聚合;逐条核对手算结果。 45 分钟
必读 R19 · CS50 SQL Week 2:Designing 主键、外键、约束与表的关系。 45 分钟
选读 R17 · Harvard CS50 SQL Relating 与 Writing 中连接、写入和事务相关内容。 30 分钟

实战拆解

  1. 画出两张表,并用一句话解释每张表“一行是什么”。先准备十几条带重复、缺失和失败的合成记录,手算两三个查询答案。

  2. 写创建表与种子数据脚本,明确约束。插入一条明显无效记录,确认数据库会拒绝,且应用能给出可理解的错误。

  3. 完成三类查询:找出未完成任务、按类别统计真实运行、计算有数据记录的耗时。统计成功率时保留失败和未知的区别,写明分母。

  4. 做一次小迁移,例如增加一个状态字段。先备份、迁移、验证、再恢复到备份;不要只记录“迁移命令执行成功”。

  5. 建立最小数据字典:字段含义、单位、空值含义、来源和保留期限。没有业务用途的字段先删除,而不是为了未来可能有用而全部收集。

交付与验收

本周交付 怎样确认真的完成
schema 与迁移 约束可实际触发;能恢复一份本地备份。
三条可核验查询 结果与合成数据手算一致,连接没有意外把行数翻倍。
数据字典 每个指标的粒度、来源、单位和缺失含义明确。

不用代码生成器的练习: 自己写一条查询:找出“有失败运行、但之后从未成功”的任务;先用几行纸面数据确定答案,再执行。

隐私与安全检查: 数据库文件、备份和导出的 CSV 都可能包含敏感信息。公开仓库只放合成种子,不上传真实数据库;网络输入必须通过参数化接口传入查询,不直接拼接 SQL。不要把备份复制到公开静态目录。

落到日常生活: 为一个常用工具增加最少量结构化记录,之后能查“哪里经常失败”,而不是收集自己完整的生活轨迹。

过关或补课判断: 能解释连接和聚合的分母、能识别重复写入后再继续。把“无数据”显示为零属于尚未过关。

本周可复制的协作提示

请先审查一行数据的含义,再设计最少的关系表与约束。只用合成记录,写三个可以手算核验的查询和一个可回退迁移。不要接云端数据库,不用真实生活或工作记录作种子。

本周来源与核对范围

来源编号与核对说明沿用课程原文,基线为 2026-09-27。未逐一登录完成外部实验;实施前请核对最新版本与访问条件。

  1. R17
    Harvard CS50 SQL ↗

    公开目录;查询、关系、设计与写入是主线选读范围。

  2. R18
    CS50 SQL Week 0:Querying ↗

    选 SELECT、筛选、排序与聚合。

  3. R19
    CS50 SQL Week 2:Designing ↗

    选键、约束、关系和设计取舍。