恩, 好象不缺少一些关系数据库的基础知识.
简单的说, 在关系型数据库中的每一个表都具备这样的特点, 在同一个表中没有完全一致的两行数据, 当一行数据可以有少数几个属性确定的话, 这几个属性就可以成为主键, 设立了表的主键之后, 数据库系统会为主键的列建立索引和制约, 利用主键进行检索的速度是最快的.
如果有两个表AB, 他们之间存在着某种对应关系, 这种关系可以是A中一行记录对应于B中的一行记录, 也可以是A的一行记录对应于B的多行记录, 还可以是A的多行对应于B的多行, 在关系型数据库中, 这种对应关系也要做成关系表, 下面就一对一, 一对多, 多对多几种情况来说明一下关系表
一对一
表A(学号, 姓名)
表B(学号, 学习成绩)
表A是一份学生名单, 学号是主键
表B是一份成绩单, 学号也是主键, 这样两个表就是一对一的关系, 反映出这一关系的是学号, 如果把表A做为主表的话, 表B的学号就是外键了
一对多
表A(班级, 人数)
表B(学号, 姓名)
表A是一份班级列表, 表B是一分学生名单, 每个学生都属于某一个班级, 而一个班级可以有很多学生
为了表示这样的关系, 可以做一个关系表C(学号, 班级) 其中, 学号是主键, 这就保证了一对多的关系, 而学号和班级, 都是外键, 由于B,C
多对多
表A(课程, 学分)
表B(学号, 姓名)
表A是一份课程表
表B是份名单, 一个学生可以选多门课程, 一门课程中也可以有很多学生, 为了反映这样的关系建立表C(课程, 学号)其中课程和学号都是主键, 这就保证了多对多的关系, 同时他们也是外键
作为外键的属性反映了主表中的某些属性, 因此其类型要和主表的对应属性一致才行
建立了外键之后会产生一致性的制约, 比如说, 在一对多的例子中, 不允许在关系表中出现主表中没有的学号或者是班级, 另外, 对外键的更新和删除, 也就有了下面两种制约
- 级联, 当删除了主表的的主键之后, 同时也删除关系表中的外键, 比如, 删除了一对多的例子中删除了班级, 系统会自动删除关系表C中含有该班级的所有记录
- 制约, 只有当关系表中没有与该主键对应的外键时才允许删除该主键, 再比如, 在一对多的例子中, 想删除某一班级的话, 就必须先删除关系表C中所有含该班级的记录
外键的设立可以保证数据的对应关系避免因为错误操作而遭到破坏, 同时, 外键也可以提示系统事先建立索引和结合操作的执行计划, 从而提高结合计算的效率
|