SQL:基本概念

1、关系模型

关系模型本质上是若干个存储数据的二维表:

每一称为记录(Record),一个记录是一个逻辑意义上的数据;

每一称为字段(Column),每个记录都有相同的若干字段。

 

1.1、主键Primary Key:能够唯一区分出不同记录的字段

选取主键的基本原则:不使用任何业务相关的字段作为Key。

一般把主键字段命名为id,常见的可作为id的类型有:

  • 自增整数BIGINT(最常用);
  • 全局唯一GUID。

联合主键(尽量少用)

通过多个字段标识一条记录,这些字段都设置为主键称为联合主键

对于联合主键,允许一列重复,但不允许全部重复。

 

1.2、外键(Foreign Key)

一个表的某个属性,为另一个表的主键,这个属性称为这个表的外键。

这个表通过外键字段与另一个表形成关联。

 

如果当前有两个表:classes与students

  • classes为班级信息表
  • students为学生信息表

students表中有字段class_id表示他所处的班级,它必须是classes表中存在的班级,即它必须是classes表中id列中存在的id;

外键并非通过列名实现,而是通过定义外键约束实现:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
  • fk_class_id:外键约束名称;
  • FORIEIGN KEY(class_id):哪个字段为外键;
  • REFERENCES classes (id):将这个外键关联到classes表的id列(classes表的主键)

通过定义外键约束,可以避免插入无效数据,即如果classes表中没有id=99的记录,那students表就无法插入class_id=99的记录。

由于外键约束会降低数据库的性能,大部分互联网应用程序为追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。此时,class_id仅仅是一个普通的列,它只是起到一个外键的作用。

删除外键约束

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

删除外键约束而非删除外键列

 

1.3、多对多关系

一对多关系是通过一个表的外键关联到另一个表。

多对多的关系则是通过两个一对多关系表实现的,其中一个是中间表,用于关联两个一对多关系,就形成了多对多关系

 

2、索引

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,可以大大加快查询速度。

例如,对于表students

 

如果经常访问score列,可以建立score列上的索引:

ALTER TABLE students
ADD INDEX idx_score(score);

通过ADD INDEX idx_socre(score)创建了一个名为idx_score,使用列score索引。索引名是任意的,如果索引有多列,可以在括号中依次写上:

ALTER TABLE students
ADD INDEX indx_name_score (name,score);

索引的效率取决于索引列的值是否散列,即该列值越互不相同效率越高。反之如果存在大量相同值,比如对于gender列,M、F值一样多,那么对该列创建索引就没意义了。

可以对同一张表创建多个索引。

优点:提高查询效率;

缺点:在增删改后,需要同时修改索引,因此索引越多,增删改的速度就越慢。

对于主键,关系数据库会自动创建索引。因此使用主键索引的效率是最高的,因为主键会保证绝对唯一。

2.1、唯一索引

有的列,比如身份证号、邮件地址等,也具有唯一性,但由于包含了业务信息,因此不宜作为主键。

这些列具有唯一性约束:即不能出现两个记录具有相同的列值,这时就可以给该列添加一个唯一索引。比如,我们假设students表的name不能重复:

ALTER TABLE students
ADD UNIQUE INDEX uni_name(name);

通过关键字UNIQUE关键字,我们就添加了一个唯一索引

 

也可以只对某一列添加唯一约束而不创建唯一索引

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

此时,name列没有索引,但仍具有唯一性保证。

不过有无索引对我们使用关系数据库没有任何区别——有索引时,数据库会自动使用索引来提高查询效率,没有时也能正常执行,只是速度会变慢。因此索引可以在使用数据库过程中逐步优化。

 

posted @   ShineLe  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示