🗄️ 第五章 引入数据库-数据库的结构与表的设计
📄 一句话概括

实体翻成表:users / books / reviews 三张表定案——一对多关系靠外键直连,本例不需要额外中间表,因为书评自己就是那座桥。同时用 1NF~3NF 全体检一遍。

📝 本节和前面几节的关系

5-17 挑好了实体和关系,本节翻成逻辑层的表清单(只列表名/列名/主外键,不配类型——那是 5-19 的事)。本节也回答了一个常见疑问:什么时候才需要中间表?

一、表清单(逻辑模型)

users   (user_id PK, nickname, email, password)
books   (isbn PK, title, author, published)
reviews (review_id PK, user_id FK→users, isbn FK→books, score, body, created_at)

外键落位规则:一对多关系,外键永远塞在「多」的那一方——书评是两对关系里的「多」,所以它揣着两把外键。

二、中间表什么时候才需要

情形 结构
关系只是「连一下」、无附加数据 一对多直连即可(本例)
多对多、或关系自带属性 造中间表(学生选课、订单明细)

假想需求升级:「用户想标记读过某书(不写评)」——用户↔书变成多对多,这时才加第四张表 reads(user_id, isbn, read_at)。需求变了结构才变,不提前造空表。

三、三范式体检

四、动手 Demo:画关系连线图

users ──1:n── reviews ──n:1── books
 (用户)        (书评=桥)       (书)

外键:reviews.user_id → users.user_id
      reviews.isbn     → books.isbn

三表两外键——对照 5-16 的终点图,逻辑层已完全对齐,只差配类型和约束。

五、30 秒实验

若需求要求「评论可以修改」,reviews 要加什么列?(updated_at 修改时间——5-4 说的「异常流程长出列」的实证。)

六、常见误区

自测三问 1. 外键塞在关系哪一方?(「多」的那一方) 2. 本例为什么不需要中间表?(书评自己承担了桥的角色;两对关系都是一对多) 3. 什么需求出现才加中间表?(用户↔书多对多时——比如标记「读过」)

相关笔记