日期:2026-10-18。对应第七章初稿。本章只读探查现有 Chinook,尚未建立 TM/QM 或执行语义查询。
沿用第六章的 CLI、Launcher 0.1.24,服务地址 http://127.0.0.1:18067,Namespace chinook,命名数据源 chinook-sqlite。本次复查连接成功,数据源指向 练习目录\lab\data\Chinook_Sqlite.sqlite;未重新安装组件或重启服务。
capabilities 返回 engine=java、runtimeApiVersion=foggy-runtime-api/v1、schemaVersion=2026-06-06、securityMode=none-dev-test-only,表结构探查与只读 SQL 能力可用。Runtime 的本地开发测试提示保留在响应中;本章没有验证业务身份或生产权限。
本次探查 Customer、Invoice、InvoiceLine、Track、Genre 五张表,核对这五张表之间的四条外键关系。Customer → Employee、Track → Album/MediaType 等不在本轮关联核对范围。
所有查询均通过公开 CLI 的 sql query --file 执行,限定数据源、最多 100 行输出和 5 秒查询超时。查询没有写入、建表或数据修复操作。
| 文件 | 核对内容 |
|---|---|
| 01-overview.sql | 五张表记录数、账单日期范围和全库金额 |
| 02-invoice-sample.sql | 2012 年前五张账单及其明细合计 |
| 03-invoice-reconciliation.sql | 全部账单逐张对账、无明细账单与差额 |
| 04-core-relations.sql | 四条核心关联的空键与孤立记录 |
| 05-data-shapes.sql | 日期存储、数量、价格、金额精度及国家字段 |
| 06-monthly-invoices-2012.sql | 2012 年每月账单数、客户数和金额 |
| 07-monthly-lines-2012.sql | 2012 年每月明细数、数量和金额 |
| 08-join-grain-2012.sql | 关联后累计账单头导致重复计算的实测对照 |
| 09-line-sample.sql | 账单 252 的两条原始明细 |
| 10-genre-values.sql | 25 个实际分类值,含音乐与影视分类 |
CLI 命令和退出码见调用记录。五份 inspect-*.json 与十份查询响应位于同一证据目录,保存列信息、返回行、警告与截断状态;本轮结果未截断。
这些定义用于本例教学,交作者和读者审阅;数据检查通过不等于真实企业已经确认业务口径。
ISSUED 条件,也不推断取消或退款记录。Invoice.InvoiceDate 是账单统计日期,按原始记录使用;没有时区列,不自行转换。固定 2012 年左闭右开区间,月间练习用十月、十一月。Invoice.Total,明细粒度使用 InvoiceLine.UnitPrice * Quantity,不改用曲目目录 Track.UnitPrice。金额沿用样例原始单位;核心表未提供币种,本例不贴人民币或美元标签、不做分元换算。SQL 对账展示到两位小数,独立校验用 Decimal 逐笔计算。InvoiceId,销售数量累计 Quantity;平均账单金额按当前范围总金额除账单数,不能累加平均值。分母为零的表达在第八章按实际引擎支持另行验证。CustomerId 为识别键,FirstName 与 LastName 组合为展示名,后续排名按 ID 区分客户。Invoice.BillingCountry,Customer.Country 命名为客户国家;当前两者值全部一致,也不合并含义。InvoiceLine.TrackId → Track.GenreId → Genre,使用分类 ID 与名称。Genre 同时含 Rock、Jazz、TV Shows、Drama 等值,后续采用“内容分类”作为公开名称。五张表分别为 59、412、2240、3503、25 行;账单日期从 2009-01-01 到 2013-12-22,实际日期值均为文本、时间部分均为零点。全部 412 张账单均有明细,逐张金额一致,全库金额 2328.60。
2012 年有 83 张账单、447 条明细,总额 477.53;十月 42.62,十一月 37.62。错误地关联后累加账单头,全年金额变为 4256.25。完整十二个月结果见baseline.json。
四条核心关联未发现空键或孤立目标。Track.GenreId 在结构上允许为空,但这份样例里均有值;未来数据出现空值时,需保留金额并明确未分类的处理方式,不能根据本次“没有空值”把规则写死。
样例中的 Quantity 全为 1,账单国家与客户国家、明细价格与目录价格均相同;它们只是本文件中的数据现象。账单与明细未出现不能解析的日期、负账单金额、无效明细数量或超出两位小数的金额。
独立校验脚本以只读方式读取原始行,用 Python 字典核对关系,用 Decimal 计算逐账单及逐月合计,不复用 SQL 的 JOIN 和聚合结果作为预期值;同时核对 CLI 与原始表的字段、主键及外键。原件和副本均仍匹配固定样例 SHA256。通过结果见acceptance.json。
在服务已就绪的教学环境中执行:
Set-Location '练习目录\lab'
.\checks\collect-chapter-07.ps1
python -X utf8 .\checks\verify-chapter-07.py
采集脚本只调用公开 CLI,校验脚本检查响应和只读原始数据;不写源数据库、不生成语义模型。服务关闭时先按环境说明恢复,不重新下载或初始化现有样例。
当前只完成物理数据探查与独立基线。语义模型校验、自然语言到 DSL 的问答验收、Console 与 FAP 均留在后续章节。