廖雪峰SQL教程读书笔记(二):关系模型

关系模型的本质就是若干储存数据的二维表,表的每一行称为记录(Record),记录是一个逻辑意义上的数据;每一列称为字段(Column),同一个表的每一行记录都有相同的若干字段。

字段定义了数据类型,及是否允许为NULL,NULL表示字段数据不存在但并不是0空‘’

关系表中,两条记录不能重复。不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,此字段就是主键

主键是关系表中唯一定位记录的,记录插入到表中后,主键最好不要再修改。

举例,比如身份证号似乎就是一个不错的主键,但是身份证号作为一种业务场景,如果身份证号升位了,作为主键,不得不修改的时候,就会对业务产生严重影响。

所以,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

主键不应该允许NULL

主键最好是完全与业务无关的字段,此字段一般命名为id。常见的有:

  1. 自增整数类型:数据库在插入数据时自动为每一条记录分配一个自增整数。(INT自增类型上限约21亿,BIGINT自增类型上限922亿亿条记录)
  2. 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似3hajgd-8942df-9sdfda-egea9-sdgaesdgew8。GUID算法通过网关MAC地址、时间戳、随机数保证人以计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法。

联合主键:两个或更多的字段都设置为主键。允许一列有重复。尽量不使用。

外键:在students表中,通过class_id的字段,可以把数据与另一张表关联起来,这种列称为外键。外键并不是通过列名实现的,而是通过定义外键约束实现的。

# 外键并不是通过列名实现的,而是通过定义外键约束实现的
ALTER TABLE student   # 指定外键所在表格
ADD CONSTRAINT fk_class_id   # 约束外键,名称随意
FOREIGN KEY (class_id)   # 指定class_id作为外键
REFERENCES classes(id)   # 指定此外键将关联到classes表的id列(也就是classes表的主键)
# 删除外键
ALTER TABLE students
DROP FOREIGN KEY fk_class_id   # 删除约束,并不删除列

外键会降低数据库性能,大部分互联网应用程序为了速度并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。此时,class_id只是一个普通的列,通过逻辑关系实现外键的功能。

外键实现一对多。通过一个中间表,将两个一对多放在一起可以实现多对多。

一对一本质是将一个表拆分成两个,便于数据处理。

索引是关系数据库中对某一列或多列的值进行与排序的数据结构。实现数据库不必扫描整个表,直接定位到符合条件的记录,从而加快查询速度。但是会导致更新记录的速度降低。索引列的值离散性越强,价值越大。

唯一索引具有业务含义的、看似唯一的列(身份证号码)不适合做主键,但是适合做唯一索引。

ALTER TABLE students
ADD INDEX idx_name_score(name,score)   # 增加索引
ADD UNIQUE INDEX uni_name(name)   # 添加唯一索引
ADD CONSTRAINT uni_name UNIQUE (name)   # 只对某列添加唯一约束而不创建唯一索引,此时name列没有索引,但是具有唯一性保证。

.
.
.
2019-01-04 13:56:28写于山东

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值