为什么需要数据库?
在文件系统里,每个部门各管各的文件,于是出现这些问题:
- 数据冗余:同样的数据存了很多遍,浪费空间。
- 数据不一致:一份改了,其他的没改,结果互相矛盾。
- 不好查找和共享:每提一个新问题,就要写一个新程序。
- 安全性差:很难控制谁能看什么。
- 数据孤立和依赖:文件格式各不相同;文件结构一改,程序就出错。
数据库是把相关数据有条理地放在一处的集合,这样数据可以共享、保持一致,也更安全。
数据库管理系统(DBMS)
DBMS是用来创建、存储、更新、查找和管理数据库的软件,还能控制谁可以使用它。例如:MySQL、Oracle、PostgreSQL、SQLite、Microsoft Access。
好处:冗余少、数据一致、很多人可以同时使用、用密码和权限保证安全、能备份和恢复,还可以用查询语言(SQL)轻松查找。
日常用途:银行、火车订票、学校档案、网上购物、医院。
关系模型:关系、属性、元组、域
在关系数据模型中,数据保存在表里。
- 关系:一张有名字的表,例如 STUDENT。
- 属性:一列,例如 Name。
- 元组:一行,也就是一条完整的记录。
- 域:一个属性允许取的值的集合,例如 Class ∈ {9, 10, 11, 12}。
- 度:属性(列)的个数。
- 基数:元组(行)的个数。
规则:每一列的名字都不同;行或列的顺序无所谓;没有两行完全一样;每个单元格只放一个值(或者 NULL,表示未知)。
键:候选键、主键和备用键
- 候选键:一个属性(或一组属性),它的值对每一行都唯一,而且从不为 NULL。一张表可以有不止一个候选键。
- 主键:被选出来用来识别行的那一个候选键。它不能为 NULL,也不能重复。
- 备用键:没有被选为主键的其余候选键。
例子:STUDENT(AdmNo, Name, Class, Email)。Name 会重复,Class 也会重复,所以它们不是键。AdmNo 和(如果一直填写且互不相同的)Email 是候选键。选 AdmNo 作主键,Email 就成了备用键。
另外还有两个有用的概念:复合键是把两列或更多列合在一起用(比如 Class + RollNo);外键是一张表里的一列,它指向另一张表的主键,把两张表联系起来。
动手试试:在你的学生证里找键
看看你的学生证或公交卡。把每个项目(姓名、班级、学号、入学编号、电话)都列出来。对每一项问两个问题:两个学生会有相同的值吗?它可以为空吗?写下哪些是候选键,你会选哪一个当主键。然后在 3D 的第 6 步里再试一遍同样的想法。
重点公式和概念
- 关系 = 表;属性 = 列;元组 = 行
- 度 = 列数;基数 = 行数
- 候选键:唯一 + 不为 NULL
- 主键 = 选中的候选键;备用键 = 其余的候选键
例题讲解
1. 一张表有 5 列 30 行。求它的度和基数。
度 = 5,基数 = 30。
2. 一张 4 × 10(度为 4,基数为 10)的表,增加 2 行和 1 列后,新的值是多少?
度 = 5,基数 = 12。
3. EMPLOYEE(EmpID, Name, Aadhaar, Dept)。指出候选键、主键和备用键。
EmpID 和 Aadhaar 都是唯一的 → 候选键。选 EmpID 作主键;Aadhaar 是备用键。Name 和 Dept 可能重复。
4. 为什么 Name 不能作 STUDENT 的主键?
两个学生可能同名,所以它不能唯一地确定一行。
5. 写出用一个字母保存的属性 Gender 的域。
{"M", "F", "O"}(或者学校允许的其他代码)。
常见错误
- 把列叫成元组。元组 = 行;属性 = 列。
- 说度是行数。度数的是列。
- 以为一张表只能有一个候选键。可以有很多个,但主键只有一个。
- 允许主键列出现 NULL。