关系模型
关系数据库是建立在关系模型之上的,关系模型本质就是若干个存储数据的二维表,可以看成是很多个excel表。
表的行:是一条记录(Record),是一个逻辑概念;
表的列:称为字段(Column),每一行有若干字段。
字段定义了数据类型(如整形,浮点型,字符串等),以及是否允许为NULL。
*注意NULL表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串‘ ‘。
通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
表和表之间的关系有“一对多”“多对一”和“一对一”。
主键
能通过它唯一区分记录的字段称为主键。也就是说,数据库中主键不能相同,一个主键只能有一条记录。比如下表如果设置name为主键,那么数据库中就不能存同名的其他人。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
因此主键最好选择与业务无关的字段,像身份证号都不可以作为主键。此外主键最好不要允许NULL类型。
一般使用 id 字段作为主键,id有两种类型:
- 自增型:插入数据时系统自动分配一个自增数,简单方便最常用;如
BIGINT NOT NULL AUTO_INCREMENT
- GUID全局唯一标识符:是一种由算法生成的二进制长度为128位的数字标识符。
*联合主键:通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。不常用。
外键
通过外键字段,可以将该条记录和另外一个数据表关联。
比如我们还有一个class表,前面学生表中的class_id就是外键,它与class表关联。
外键不是通过命名关联的,而是通过程序约束实现的:
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
其中,外键约束的名称fk_class_id
可以任意,FOREIGN KEY (class_id)
指定了class_id
作为外键,REFERENCES classes (id)
指定了这个外键将关联到classes
表的id
列(即classes
表的主键)。
通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes
表不存在id=99
的记录,students
表就无法插入class_id=99
的记录。
外键约束会影响性能,很多公司并不设置外键约束,仅靠程序保证逻辑正确。
删除外键:
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
该操作只是删除了外键约束,实际外键那一列没有被删除。
利用外键可以形成一对多的关系,多对多关系是通过中间表实现的,即两个一对多关系。
索引
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。
通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
例如学生表中可以对score创建索引:
ALTER TABLE students
ADD INDEX idx_score (score); idx_score是索引名称,是任意的。
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。如果存在大量相同的值,则索引将失去意义。
索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
唯一索引:
像一些字段需要具有唯一性,比如身份证号,我们可以添加唯一约束:
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
如果还需要添加索引,有唯一索引:
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。
参考:廖雪峰的SQL教程