学习sql关系模型并总结, 来源廖雪峰教程
- 表的每一行称为记录: 记录一个逻辑意义上的数据
- 表的每一列称为字段: 同一个表的每一行, 都拥有相同的若干字段
- 字段定义了数据类型(整型, 浮点型, 字符型, 日期)
- 字段个定义了是否允许为
NULL
NULL
表示字段不存在- 字段应该避免允许NULL的数据
NULL
可以简化查询条件, 加快查询速度, 利用读取数据后进行判断是否为NULL
- 表和表之间应该建立"一对多", "多对一"的关系
主键
- 一张表的每一行数据: 记录
- 一条记录由多个字段组成
- 每一条记录都包好若干个定义的好的字段
- 同一个表的所有记录都有字段定义
- 任意两条记录不能重复, 某个字段唯一区分不同的记录, 称为主键
- 主键不能再修改
- 不适用任何业务相关的字段作为主键
- 主键类型:
- 自增整数类型
- 全局唯一GUID类型
- INT自增类型, 记录数最多21亿, BIGINT自增类型最多922亿亿
联合主键
- 允许通过多个字段唯一标识记录.
- 两个或者更多的字段都设置为主键.
- 尽量不使用联合主键, 复杂度的上升
外键
- 通过某个字段, 把数据与另一张表关联起来: 外键
- 外键并不是通过列名实现, 通过定义外键约束实现
- 通过外键约束查询, 关系数据库可以保证插入无效数据
- 外键约束, 会降低数据库性能
添加外键约束
mysql> ALTER TABLE students
-> ADD CONSTRAINT fk_class_id
-> FOREIGN KEY (class_id)
-> REFERENCES classes (id);
ADD CONSTRAINT fk_class_id
: 添加一个约束, 约束名称任意指定FOREIGN KEY (class_id)
: 指定class_id
作为外键REFERENCES classes (id)
: 关联到classes
的id
删除约束
mysql> ALTER TABLE students
-> DROP FOREIGN KEY fk_class_id;
多对多
- 多对多是通过两个一对多实现的
- 通过一个中间表
一对一
- 一个表的记录对应到另一个表的唯一记录
- 大的表格拆成两个表格, 经常读取和不经常读取的, 以获取更高的性能
索引
- 索引: 对某一列或多个列的值进行预排序的数据结构
添加索引
mysql> ALTER TABLE students
-> ADD INDEX index_score (score);
- 索引可以有多列
mysql> ALTER TABLE students ADD INDEX index_name_score (name, score);
- 索引的效率取决于索引的值是否离散. 大量重复的值, 效率并不高
- 优点: 查询效率高
- 缺点: 插入, 更新, 删除记录的速度变慢, 需要同时修改索引
- 主键, 自动创建主键索引, 主键索引效率最高, 因为主键保证绝对唯一
唯一索引
-
因为业务中含义的字段不宜用作主键
-
又有些业务, 某个非主键字段不能重复, 例如身份证, 便给该列添加
唯一索引
-
添加唯一索引
mysql> ALTER TABLE students
-> ADD UNIQUE INDEX uni_name (name);
- 对某一列添加一个唯一约束, 而不创建索引
mysql> ALTER TABLE students ADD CONSTRAINT strain_uni_name UNIQUE (name);