本周要回答: 当数据积累到几十条或几百条,你能说明每个数字从哪里来,重复和缺失怎样处理吗?
进入本周前: 理解对象、数组、输入校验和基本 Git;能够分辨“原始数据”与“计算结果”。
- 01定义数据粒度
- 02约束写入
- 03查询与核对
- 04迁移与恢复
学习内容与理解目标
本周以本地 SQLite 或另一种已了解的关系数据库学习数据建模。先定义一行代表什么,再考虑表怎么关联。掌握主键、外键、非空、唯一约束、查询条件、排序、聚合和基本连接;学会区分零、未知和不适用。数据库查询本身不复杂,真正容易出错的是把不同粒度的数据混在一起。
建议使用两个简单实体:任务与运行记录。一项任务可以有多次运行,失败运行也需要记录。还应理解事务与迁移:多个有关联的写入不能只成功一半;修改字段要有版本和恢复路径。本周只用合成数据,不搭一个云端分析平台。
学习链接与选读范围
| 级别 | 官方或原始资料 | 本周只读这些 | 阅读预算 |
|---|---|---|---|
| 必读 | R18 · CS50 SQL Week 0:Querying | 筛选、排序与聚合;逐条核对手算结果。 | 45 分钟 |
| 必读 | R19 · CS50 SQL Week 2:Designing | 主键、外键、约束与表的关系。 | 45 分钟 |
| 选读 | R17 · Harvard CS50 SQL | Relating 与 Writing 中连接、写入和事务相关内容。 | 30 分钟 |
实战拆解
画出两张表,并用一句话解释每张表“一行是什么”。先准备十几条带重复、缺失和失败的合成记录,手算两三个查询答案。
写创建表与种子数据脚本,明确约束。插入一条明显无效记录,确认数据库会拒绝,且应用能给出可理解的错误。
完成三类查询:找出未完成任务、按类别统计真实运行、计算有数据记录的耗时。统计成功率时保留失败和未知的区别,写明分母。
做一次小迁移,例如增加一个状态字段。先备份、迁移、验证、再恢复到备份;不要只记录“迁移命令执行成功”。
建立最小数据字典:字段含义、单位、空值含义、来源和保留期限。没有业务用途的字段先删除,而不是为了未来可能有用而全部收集。
交付与验收
| 本周交付 | 怎样确认真的完成 |
|---|---|
| schema 与迁移 | 约束可实际触发;能恢复一份本地备份。 |
| 三条可核验查询 | 结果与合成数据手算一致,连接没有意外把行数翻倍。 |
| 数据字典 | 每个指标的粒度、来源、单位和缺失含义明确。 |
不用代码生成器的练习: 自己写一条查询:找出“有失败运行、但之后从未成功”的任务;先用几行纸面数据确定答案,再执行。
隐私与安全检查: 数据库文件、备份和导出的 CSV 都可能包含敏感信息。公开仓库只放合成种子,不上传真实数据库;网络输入必须通过参数化接口传入查询,不直接拼接 SQL。不要把备份复制到公开静态目录。
落到日常生活: 为一个常用工具增加最少量结构化记录,之后能查“哪里经常失败”,而不是收集自己完整的生活轨迹。
过关或补课判断: 能解释连接和聚合的分母、能识别重复写入后再继续。把“无数据”显示为零属于尚未过关。
本周可复制的协作提示
请先审查一行数据的含义,再设计最少的关系表与约束。只用合成记录,写三个可以手算核验的查询和一个可回退迁移。不要接云端数据库,不用真实生活或工作记录作种子。
本周来源与核对范围
来源编号与核对说明沿用课程原文,基线为 2026-09-27。未逐一登录完成外部实验;实施前请核对最新版本与访问条件。
- R17Harvard CS50 SQL ↗
公开目录;查询、关系、设计与写入是主线选读范围。
- R18CS50 SQL Week 0:Querying ↗
选 SELECT、筛选、排序与聚合。
- R19CS50 SQL Week 2:Designing ↗
选键、约束、关系和设计取舍。