Skip to content

2. 关系模型

注意NULL表示字段数据不存在。通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。

1. 主键

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

常见的可作为id字段的类型有:

  1. 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;上限是2147483647(约21亿)。用法:在字段定义后加上AUTO_INCREMENT
  2. 全局唯一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;