关系建模
引入
词汇
| English | 释义 | 拼音 |
|---|---|---|
| relationship/rɪˈleɪʃənʃɪp/ | 联系 | lián xì |
| databases/ˈdeɪtəbeɪsɪz/ | 数据库 | shù jù kù |
| entity/ˈentɪti/ | 实体 | shí tǐ |
| cardinality/ˌkɑːdɪˈnælɪti/ | 基数 | jī shù |
| primary key/ˈpraɪməri kiː/ | 主键 | zhǔ jiàn |
| foreign key/ˈfɒrən kiː/ | 外键 | wài jiàn |
| referential integrity/ˌrefəˈrenʃl ɪnˈteɡrɪti/ | 引用完整性 | yǐn yòng wán zhěng xìng |
实体、联系、键
- 数据库 databases 模型是关于领域的一组真语句。实体 entity 是被计数的东西(Student);联系 relationship 连接实体(enrolls)。两端的基数 cardinality——一或多——变成键与表。
- 主键 primary key 唯一标识一行;外键 foreign key 引用它,引擎强制引用完整性 referential integrity:选课不可能指向不存在的学生。

{exercise:uni-cs0801-model}
练习
多对多联系变成——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
连接表装外键对;两端都装不下对方。
多对多需要一张表
- 一个学生选多门课;一门课收多个学生:联系变成自己的连接表,装外键对。
- 规则住进键里:
PRIMARY KEY (student_id, course_id, term)让第二次相同选课不可能——引擎拒绝,不靠应用。
{exercise:uni-cs0801-junction}
练习
主键 (student, course, term) 强制——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
复合键在引擎层拒绝重复三元组。
连接路径
- 哪些学生修某系的课?Student 按
student_id连 Enrollment、按course_id连 Course、按dept_id连 Department——三次连接,各自沿着外键。 - 样例数据:8 学生、6 课程、14 选课——过滤前连接路径产出 14 行。绝不要把学生姓名存进 Enrollment:重复且漂移。
例子
选代理键而非邮箱做主键:邮箱会变,代理键不会。
{exercise:uni-cs0801-join}
练习
样例数据上 Student-Enrollment-Course-Department 的连接产出——行。
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
14 条选课承载路径;每条选课一行。