2. 关系模型
注意NULL
表示字段数据不存在。通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
1. 主键⚓
选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。
常见的可作为id
字段的类型有:
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;上限是2147483647(约21亿)。用法:在字段定义后加上
AUTO_INCREMENT
- 全局唯一GUID类型:使用一种全局唯一的字符串作为主键;大部分编程语言都内置了GUID算法,可以自己预算出主键。
1.1 联合主键⚓
通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键
。
尽量不使用联合主键。
2. 外键⚓
2.1 添加外键约束(CONSTRAINT):⚓
ALTER TABLE <table>
ADD CONSTRAINT <foreign-key-name>
FOREIGN KEY <column>
REFERENCES <other-table>(<other-table-column>);
-
table:本表
-
foreign-key-name:任意约束名称
- column:字段
- other-table(other-table-column):其它表的字段
由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。
CREATE TABLE CHILD(ID SMALLINT UNSIGNED AUTO_INCREMENT, PID SMALLINT UNSIGNED, PRIMARY KEY(ID), CONSTRAINT `PARENT_ID` FOREIGN KEY (PID) REFERENCES PARENT(ID));
2.2 删除外键约束:⚓
ALTER TABLE <table>
DROP FOREIGN KEY <foreign-key-name>;
注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...
实现的。
2.1 多对多⚓
通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系。
2.2 一对一⚓
一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能。
3. 索引⚓
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
优点
是提高了查询效率,缺点
是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
3.1 添加索引:⚓
ALTER TABLE <table>
ADD INDEX <index-name> (column1, column2, ...);
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
可以对一张表创建多个索引。
对于主键,关系数据库会自动对其创建主键索引。
3.1 唯一索引⚓
既有唯一性约束,又有索引。
ALTER TABLE <table>
ADD UNIQUE INDEX <index-name> (column);
3.2 唯一性约束⚓
也可以只对某一列添加一个唯一约束而不创建唯一索引:
ALTER TABLE <table>
ADD CONSTRAINT <unique-name> UNIQUE(column);
4. 示例⚓
CREATE TABLE IF NOT EXISTS blog(
id INT(11) AUTO_INCREMENT ,
title VARCHAR(180) NOT NULL ,
updateDate DATE NOT NULL ,
tags VARCHAR(255) ,
type VARCHAR(255) ,
content VARCHAR(255) NOT NULL ,
userId INT NOT NULL ,
#主键约束
PRIMARY KEY (id) ,
#外键声明约束
CONSTRAINT blog_user_fk FOREIGN KEY(userId) REFERENCES user(id),
#联合唯一约束
UNIQUE KEY title_userId_u (title, userId)
)ENGINE=INNODB DEFAULT CHARSET = UTF8;