当前位置:文档之家› 理解MySQL

理解MySQL

理解MySQL
理解MySQL

架写在功能了。制、以应成本还有但是没有这些Man MyS 你有

第一1、 最接处

中间架构与在前面:最能都不支持但从5.0(集群、分应用于企业本是一个因有很多不足是MySQL 已有事,出于好些资料打算nual》和《QL 的源码。有用。 一章、MySQ MySQL 的逻最上面不是处理、认证间层是

MySQ 概念 最早接触的M 持,比如,存(2005年10区、分布式业级应用环境素,但是没足,比如,复经是一个足好奇,略微算分为两部分High Perf 。如果你是QL 架构与概逻辑架构

是MySQL 特有证、安全管理QL

的核心,理

MySQL 是在存储过程,视0月)开始,式事务,这境(很多互联没有强大功复制、分区足够好的DB 微的研究了一分,上部主要formance M 是MySQL 高手概念 有的,所有基理等。

包括查询理解MySQ 在三年前,那视图,触发MySQL 渐渐些企业级的联网公司都功能作后盾,区的支持都十BMS 了,更何一下MySQL 要讨论MyS MySQL》,如手,希望你基于网络的解析、分析QL

那时候MySQ 发器,更别说渐步入企业的特性,使都用其作为数则是不可十分有限、何况它是o L,积 累了一SQL 的优化,如果有时间你不吝赐教;的C/S 的网络析、优化和缓QL 还是4.x 说分布式事业级数据库的得现在的M 数据库服务可想象的)。查询优化仍opensource 一些资料,,其中主要间,以后在下;如果你是络应用程序缓存等。同x 版本,很事务等复杂特的 行列了;MySQL,完全务 器,尽管节虽然,MyS 仍 需要改进e 的。这段时欲总结出来要参考了《My 下部分析一是新手,希望序都应该包括同时它还提供很 多

特性;复全可节约SQL 进,时间来。ySQL 一下望对括连供跨

存储引擎的功能,包括存储过程、触发器和视图等。

最下面是存储引擎,它负责存取数据。服务器通过storage engine API可以和各种存储引擎进行交互。

1.1、查询优化和执行(Optimization and Execution)

MySQL 将用户的查询语句进行解析,并创建一个内部的数据结构——分析树,然后进行各种优化,例如重写查询、选择读取表的顺序,以及使用哪个索引等。查询优化器不 关心一个表所使用的存储引擎,但是存储引擎会影响服务器如何优化查询。优化器通过存储引擎获取一些参数、某个操作的执行代价、以及统计信息等。在解析查询 之前,服务器会先访问查询缓存(query cache)——它存储SELECT语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅 将缓存中的结果返回给用户即可,这将大大提高系统的性能。

1.2、并发控制

MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度:

(1) 表级锁:MySQL独立于存储引擎提供表锁,例如,对于ALTER TABLE 语句,服务器提供表锁(table-level lock)。

(2) 行级锁:InnoDB和Falcon存储引擎提供行级锁,此外,BDB支持页级锁。InnoDB的并发控制机制,下节详细讨论。

另外,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了使用封锁机制外,还同时结合MVCC机制,即多版本两阶段封锁协议(Multiversion

two-phrase locking protocal),来实现事务的并发控制,从而使得只读事务不用等待锁,提高了事务的并发性。

注:并发控制是DBMS的核心技术之一(实际上,对于OS也一样),它对系统性能有着至关重要的影响,以后再详细讨论。

1.3、事务处理

MySQL中,InnoDB和BDB都支持事务处理。这里主要讨论InnoDB的事务处理(关于BDB的事务处理,也十分复杂,以前曾较为详细看过其源码,以后有机会再讨论)。

1.3.1、事务的ACID特性

事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性(Jim Gray在《事务处理:概念与技术》中对事务进行了详尽的讨论)。

(1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

(2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

(3)隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外

部是不可见的,反之亦然。

(4)持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

1.3.2、事务处理带来的相关问题

由于事务的并发执行,带来以下一些著名的问题:

(1)更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。

(2) 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加 控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。 (3)不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

(4)幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

1.3.3、事务的隔离性

SQL2标准定义了四个隔离级别。定义语句如下:

SET TRANSACTION ISOLATION LEVEL

[READ UNCOMMITTED |

READ COMMITTED |

REPEATABLE READ |

SERIALIZABLE ]

这 与Jim Gray所提出的隔离级别有点差异。其中READ UNCOMMITTED即Jim的10(浏览);READ COMMITTED即20,游标稳定性;REPEATABLE READ为2.99990隔离(没有幻像保护);SERIALIZABLE隔离级别为30,完全隔离。SQL2标准默认为完全隔离(30)。各个级别存在 问题如下:

隔离级脏读不可重复读幻象读

可能 可能 可能 读未提交

(Read

uncommitted)

不可能 可能 可能 读提交

(Read committed)

不可能 不可能 可能 可重复读

(Repeatable

read)

各 REA Rea 级别现的Rep 用M

1.3Inn (1)数据(2)务取此外记录对表(1)共享

(2)排他例如IX 锁(1)(2)Inn 如务;对表

要或

可串行化 (Serializ 个具体数据AD COMMITT ad only 隔离别外,还支的Serializ eatable r MVCC 一致性.4、InnoD

noDB 的行级共享锁(sh 据集的排他排它锁(ex 取得相同数外,InnoDB 录和表同时

表的:

意向共享锁

享锁前必须

意向排他锁他锁前必须如,SELECT 锁,意向锁事务在对表事务在获取noDB 的锁相如 果一个事反之,如果表 的请求,或者正在对able)

据库并不一TED 和Seri 离级别;SQ 支持一个叫做zable 隔离read,但在性读。国产数DB 的锁模型级锁有两种类hared lock 他锁。 xclusive lo 数据集的共享B 支持多粒度时加锁。为此锁(IS):须先取得该表锁(IX):须先取得该表T ... LOCK 锁的规则如下表T 中的记取表T 中记相容性矩阵:事务请求的果两者不兼例如,LO 对表中的记录不可能 一定完全实现alizable 两QL Server 做“快照”离级别。MyS 在具体实现时数据库DM 也型 类型: k,S):允许ock,X):允享读锁和排度加锁(mul 此,InnoDB 事务打算给表的IS 锁。事务打算给表的IX 锁。K IN SHARE 下: 记录获取S 锁记录的X 锁前:

锁模式与当兼容,该事务OCK TABLES 录加锁。使用不可能现了上述4两个标准隔除支持上述的隔离级别SQL 支持全时,有一些也支持所有级许一个事务允许获得排排他写锁。ltiple gra B 引入意向锁给数据行加 给数据行加 E MODE 加I 锁前,先要前,先要获当前的锁兼务就要等待…WRITE,用封锁机制能 个隔离级别隔离级别,另述ISO/ANSI 别,但严格全部4个隔离些特点,比如级别,其默认务去读一行,排它锁的事务anularity 锁(intent 加行共享锁,加行排他锁,IS 锁,SELE 要获取表T 获取表T 的I 兼容,InnoD 待锁释放。意意向锁的主制来进行并不可能别,例如,另外还提供I SQL92定格来说它是一离级别,其如在一些隔认级别为R 阻止其他务更新数据locking),ion locks)事务在给事务在给ECT ... FO 的IS 锁或者IX 锁。 B 就将请求意向锁只会主要目的是发控制,一能

Oracle 只提供自己定义定义的4个隔一个用MVCC 其默认级别为隔离级别下是READ COMMIT 他事务获得相据,阻止其他,从而允许),意向锁是给一个数据行给一个数据行OR UPDATE 者更强的锁求的锁授予该会阻塞其它事是表明该事务一个比较重要提供

的隔离C 实为是采TTED。 相同他事许对是针行加行加加锁; 该事事务务将要的

问题就是死锁。

来看一个死锁的例子:

例1-1

Session 1 Session 2

mysql> CREATE TABLE t (i INT) ENGINE

= InnoDB;

Query OK, 0 rows affected (0.22 sec)

mysql> INSERT INTO t (i) VALUES(1);

Query OK, 1 row affected (0.08 sec)

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM t WHERE i = 1

LOCK IN SHARE MODE;

+------+

| i |

+------+

| 1 |

+------+

1 row in set (0.01 sec)

mysql>

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM t WHERE i = 1;

等待…

mysql> DELETE FROM t WHERE i = 1;

等待…

ERROR 1213 (40001): Deadlock found

when trying to get lock; try

restarting transaction

Query OK, 1 row affected (0.00 sec)

1.3.5、一致性非阻塞读

一致性读是MySQL的重要特点之一,InnoDB通过MVCC机制表示数据库某一时刻的查询快照,查询可以看该时刻之前提交的事务所做的改变,但是不能看到该时刻之后或者未提交事务所做的改变。但是,查询可以看到同一事务中之前语句所做的改变,例如:

例1-2

Session 1 Session 2

mysql> select * from t;

Empty set (0.00 sec)

mysql> INSERT INTO t (i)

VALUES(1);

Query OK, 1 row affected (0.00

sec)

mysql> select * from t;

+------+

| i |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.01

sec)

mysql> update t set i=3;

Query OK, 1 row affected (0.00

sec)

Rows matched: 1 Changed:

1 Warnings: 0

mysql> select * from t;

+------+

| i |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+------+

| i |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.06 sec)

mysql> select * from t;

+------+

| i |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+------+

| i |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

如果事务的隔离级别为REPEATABLE READ(默认),同一个事务中的所有一致性读都是读的事务的第一次读操作创建的快照。你可以提交当前事务,然后在新的查询中即可看到最新的快照,如上所示。

如果事务的隔离级别为READ COMMITTED,一致性读只是对事务内部的读操作和它自己的快照而言的,结果如下:

例1-3

Session 1 Session 2

mysql> SET SESSION TRANSACTION

ISOLATION LEVEL READ COMMITTED;

Query OK, 0 rows affected (0.01 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+------+

| i |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

mysql> SET SESSION TRANSACTION

ISOLATION LEVEL READ COMMITTED;

Query OK, 0 rows affected (0.01 sec)

mysql> set autocommit = 0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+------+

| i |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

mysql> update t set i=5;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed:

1 Warnings: 0

mysql> select * from t;

+------+

| i |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.06 sec)

mysql> select * from t;

+------+

| i |

+------+

| 5 |

+------+

1 row in set (0.00 sec)

注意,session 2发生了不可重复读。

当InnoDB在READ COMMITTED 和REPEATABLE READ隔离级别下处理SELECT语句时,一致性读是默认的模式。一致性读不会对表加任何锁,所以,其它连接可以同时改变表。

假设事务处于REPEATABLE READ级别,当你正在进行一致性读时,InnoDB根据查询看到的数据给你一个时间点。如果其它的事务在该时间点之后删除一行,且提交事务,你不会看到行已经被删除,插入和更新操作一样。但是,InnoDB与其它DBMS的不同是,在REPEATABLE READ隔离级别下并不会造成幻像。

一致性读不与DROP TABLE 或者 ALTER TABLE一起工作。

在 nodb_locks_unsafe_for_binlog变量被设置或者事务的隔离级别不是SERIALIZABLE的情况下,InnoDB对于没有指 定FOR UPDATE 或 LOCK IN SHARE MODE的INSERT INTO ... SELECT, UPDATE ... (SELECT), 和CREATE TABLE ... SELECT语句使用一致性读,在这种情况下,查询语句不会对表中的元组加锁。否则,InnoDB将使用锁。

1.3.6、SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE的加锁读(locking read)

在一些场合,一致性读并不是很方便,此时,可以用加锁读。InnoDB支持两种加锁读:

(1) SELECT ... LOCK IN SHARE MODE:对读取的元组加S锁。

(2) SELECT ... FOR UPDATE:在扫描索引记录的过程中,会阻塞其它连接的SELECT ...LOCK IN SHARE MODE和一定事务隔离级别下的读操作。 InnoDB 使用两阶段封锁协议,事务直到提交或回滚时才会释放所有的锁,这都是系统自动执行的。此外,MySQL支持LOCK TABLES和UNLOCK TABLES,但这些都是在服务器层实现的,而不是在存储引擎。它们有用处,但是不能取代存储引擎完成事务处理,如果你需要事务功能,请使用事务型存储引 擎。

来考虑locking read的应用,假设你要在表child插入一个新的元组,并保证child中的记录在表parent有一条父记录。如果你用一致性读来读parent 表,确实可以将要插入的child row的parent row,但是可以安全的插入吗?不,因为在你读parent表时,其它连接可能已经删除该记录。(一致性读是针对事务内而言的,对于数据库的状态,它应该 叫做“不一致性读”)

此时,就可以使用SELECT LOCK IN SHARE MODE,它会对读取的元组加S锁,从而防止其它连接删除或更新元组。另外,如果你想在查询的同时,进行更新操作,可以使用SELECT ... FOR UPDATE,它读取最新的数据,然后对读到的元组加X 锁。此时,使用SELECT ... LOCK IN SHARE MODE不是一个好主意,因为此时如

果有两个事务进行这样的操作,就会造成死锁。

注:SELECT ... FOR UPDATE仅在自动提交关闭(即手动提交)时才会对元组加锁,而在自动提交时,符合条件的元组不会被加锁。

1.3.7、记录锁(record lok)、间隙锁(gap lock)和后码锁(next-key lock) InnoDB有以下几种行级锁:

(1) 记录锁:对索引记录(index records)加锁,InnoDB行级锁是通过给索引的索引项加锁来实现的,而不是对记录实例本身加锁。如果表没有定义索引,InnoDB 创建一个隐藏 的聚簇索引,然后用它来实现记录加锁(关于索引与加锁之间的关系的详细介绍请看下一章)。

(2)间隙锁:对索引记录之间的区间,或者第一个索引记录之前的区间和最后一个索引之后的区间加锁。

(3)后码锁:对索引记录加记录锁,且对索引记录之前的区间加锁。

默认情况下,InnoDB的事务工作在REPEATABLE READ的隔离级别,而且系统变量innodb_locks_unsafe_for_binlog为关闭状态。此时,InnoDB使用next-key 锁进行查找和索引扫描,从而达到防止“幻像”的目的。

Next- key锁是记录锁和间隙的结合体。当InnoDB查找或扫描表的索引时,对它遇到的索引记录加S锁或者X锁,所以,行级锁(row-level lock)实际上就是索引记录锁(index-record lock);此外,它还对索引记录之前的区间加锁。也就是说,next-key锁是索引记录锁,外加索引记录之前的区间的间隙锁。如果一个连接对索引中的 记录R持有S或X锁,其它的连接不能按照索引的顺序在R之前的区间插入一个索引记录。

假设索引包含以下值:10, 11,13和20,则索引的next-key锁会覆盖以下区间(“(”表示不包含,“[”表示包含):

(negative infinity, 10]

(10, 11]

(11, 13]

(13, 20]

(20, positive infinity)

对于最后一个区间,next-key锁将锁住索引最大值以上的区间,上界虚记录(“supremum” pseudo-record)的值比索引中的任何值都大,其实,上界不是一个真实的索引记录,所以,next-lock将对索引的最大值之后的区间加锁。

间隙锁对查询唯一索引中的唯一值是没有必要的,例如,id列有唯一索引,则下面的查询仅对id=100的元组加索引记录锁(index-record lock),而不管其它连接是否在之前的区间插入元组。

SELECT * FROM child WHERE id = 100;

如果id没有索引,或者非唯一索引,则语句会锁住之前的空间。

例1-4

Session 1Session 2

mysql> create unique index i_index on

t(i);

Query OK, 0 rows affected (0.19 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from t;

+------+

| i |

+------+

| 4 |

| 10 |

+------+

2 rows in set (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select i from t where i =10 lock

in share mode;

+------+

| i |

+------+

| 10 |

+------+

1 row in set (0.00 sec)

mysql> insert into t(i) values(9);

Query OK, 1 row affected (0.03 sec)

mysql> select * from t;

+------+

| i |

+------+

| 4 |

| 9 |

| 10 |

+------+

3 rows in set (0.00 sec)

上例中,产生了幻像问题。如果将唯一查询变成范围查询,结果如下(接上例的索引):

例1-5

Session 1 Session 2

mysql> select * from t;

+------+

| i |

+------+

| 4 |

| 9 |

| 10 |

+------+

3 rows in set (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select i from t where i>4 lock

in share mode;

+------+

| i |

+------+

| 9 |

| 10 |

+------+

2 rows in set (0.00 sec)

mysql> insert into t(i) values(1);

ERROR 1205 (HY000): Lock wait

timeout exceeded; try restarting

transaction

mysql> insert into t(i) values(8);

ERROR 1205 (HY000): Lock wait

timeout exceeded; try restarting

transaction

可以看到,session 2 的next-key使得在i=4之前的区间和之后的插入都被阻塞。

另外,如果删除索引i_index,则结果如下:

例1-6

Session 1 Session 2

mysql> drop index i_index on t;

Query OK, 3 rows affected (0.25 sec)

Records: 3 Duplicates:

0 Warnings: 0

mysql> select * from t;

+------+

| i |

+------+

| 4 |

| 10 |

| 9 |

+------+

3 rows in set (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select i from t lock in share

mode;

+------+

| i |

+------+

| 4 |

| 10 |

| 9 |

+------+

3 rows in set (0.00 sec)

mysql> insert into t(i) values(8);

等待。。。

另 外,针对插入(INSERT)操作,只要多个事务不会在同一索引区间的同一个位置插入记录,它们就不用互相等待,这种情况可以称为插入意向间隙锁 (insertion intention gap lock)。例如,索引记录的值为4和7,两个独立的事务分别插入5和6,仅管它们都持有4—7之间的间隙锁,但是它们不会相互阻塞。这可以提高事务的并 发性。

例1-7

Session 1 Session 2

mysql> select * from t;

+------+

| i |

+------+

| 4 |

| 10 |

| 9 |

| 8 |

+------+

4 rows in set (0.00 sec)

mysql> create unique index i_index

on t(i);

Query OK, 4 rows affected (0.34 sec)

Records: 4 Duplicates:

0 Warnings: 0

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec) mysql> insert into t(i) values(5);

Query OK, 1 row affected (0.00 sec)

mysql> insert into t(i) values(5);

ERROR 1205 (HY000): Lock wait

timeout exceeded; try restarting

transaction

mysql> insert into t(i) values(6);

Query OK, 1 row affected (0.00 sec)

间隙锁是可以显示关闭的,如果你将事务的隔离级别设为READ COMMITTED,

或者打开innodb_locks_unsafe_for_binlog系统变量,间隙锁就会关闭。在这种情况下,查找或扫描索引仅会进行外键约束检查和重复键值检查。

此 外,READ COMMITTED隔离级别和关闭nodb_locks_unsafe_for_binlog还有

另外一个负作用:MySQL会释放掉不匹配Where条 件的记录锁。例如,对于UPDATE 语句,InnoDB只能进行“半一致性(semi_consistent)读”,所以,它会返回最新提交事务所做改 变,从而产生不可重复读和幻像问题。

1.3.8、使用next-key lock防止幻像问题

例1-4展示了一个幻像问题。使用next-key锁的select语句可以解决幻像问题,但例1-4的之所以会产生总是在于唯一索引,使得select语句没有使用gap lock,而只使用了index-record lock。

1.4、存储引擎

插 件式存储引擎是MySQL最重要特性之一,也是最不同于其它DBMS的地方。MySQL支持很多存储引擎,以适用于不同的应用需求,常用的包括 MyISAM、

InnoDB、BDB、MEMORY、MERGE、NDB Cluster等。其中,BDB和NDB Cluster提供事务支持。

MySQL 默认的存储引擎为MyISAM,当然,创建表的时候可以指定其它的存储引擎,你可以在同一个数据库中对不同的表使用不同的存储引擎(这是非常强大而独特的 特性)。可以通过SHOW TABLE STATUS命令查询表所使用的存储引擎,例如,查看mysql数据库的user表:

mysql> SHOW TABLE STATUS LIKE 'user' \G

*************************** 1. row ***************************

Name: user

Engine: MyISAM

Version: 10

Row_format: Dynamic

Rows: 4

Avg_row_length: 61

Data_length: 244

Max_data_length: 281474976710655

Index_length: 2048

Data_free: 0

Auto_increment: NULL

Create_time: 2009-06-16 21:50:34

Update_time: 2009-09-30 14:59:08

Check_time: NULL

Collation: utf8_bin

Checksum: NULL

Create_options:

Comment: Users and global privileges

1 row in set (0.00 sec)

Name:表的名称;

Engine:表使用的存储引擎;

Row_format:记录的格式。MyISAM支持三种不同的存储格式:静态(固定长度)表(默认格式)、动态表及压缩表。静态表的字段都是固定长度的,例如CHAR和INTEGER;动态表的字段可以是变长的,例如,VARCHAR或者BLOB。

Rows:表中记录的数量。

Avg_row_length:记录的平均长度(字节数);

Data_length:表中数据的全部字节数;

Max_data_length:表中数据最大的字节数;

Index_length:索引消耗的磁盘空间;

Data_free:对于MyISAM表,表示已经分配但还没有使用的空间;该空间包含以前删除的记录留下的空间,可以被INSERT操作重用。

Auto_increment:下一个自增的值。

Check_time:上次使用CHECK TABLE或myisamchk检查表的时间。

1.4.1、MyISAM

1.4.1.1、存储

MySQL的默认存储引擎,性能与功能的折中,包括全文索引(full-text index)、数据压缩,支持空间(GIS)数据,但是,不支持事务和行级锁。一般来说,MyISAM 更适用于大量查询操作。如果你有大量的插入、删除操作,你应该选择InnoDB。 每个表包含3个文件:

(1).frm:表定义文件,对于其它存储引擎也一样。

(2).MYD文件:数据文件。

(3).MYI文件:索引文件。

可以在创建表时通过DATA DIRECTORY和INDEX DIRECTORY为数据文件和索引文件指定路径,它们可以位于不同目录。另外,MyISAM的存储格式是跨平台的,你可以将数据文件和索引文件从Intel平台拷贝到PPC或者SPARC平台。

5.0 中,MyISAM的变长记录表默认处理256TB数据,使用6字节的指针来指向数据记录;而之前的版本使用默认的4字节指针,所以只能处理4GB数据。所 有的版本都可以将指针增加到8字节指针,如果你想改变MyISAM表的指针的大小,可以通过设置MAX_ROWS和AVG_ROW_LENGTH来实现:

CREATE TABLE mytable (

a INTEGER NOT NULL PRIMARY KEY,

b CHAR(18) NOT NULL

) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;

上面的例子中,MySQL将至少可以存储32GB的数据。可以查看一下表的信息: mysql> SHOW TABLE STATUS LIKE 'mytable' \G

*************************** 1. row ***************************

Name: mytable

Engine: MyISAM

Row_format: Fixed

Rows: 0

Avg_row_length: 0

Data_length: 0

Max_data_length: 98784247807

Index_length: 1024

Data_free: 0

Auto_increment: NULL

Create_time: 2002-02-24 17:36:57

Update_time: 2002-02-24 17:36:57

Check_time: NULL

Create_options: max_rows=1000000000 avg_row_length=32

Comment:

1 row in set (0.05 sec)

可以看到,Create_options列出了创建时的选项,而且该表的最大的数据量为91GB。你可以用ALTER TABLE来改变指针的大小,但是那会导致表和索引的重建,这会花费很长的时间。

1.4.1.2、MyISAM的特性

(1)锁与并发性:MyISAM只有表级锁,不支持行级锁。所以不适合于大量的写操作,但是它支持并发插入(concurrent inserts),这是一个非常重要且有用的特性。

(2)自动修复:MySQL支持自动检查和修复MyISAM表。

(3)手动修复:你可以使用CHECK TABLE检查表的状态,并用REPAIR TABLE修复表。

(4)索引:你可以为BLOB和TEXT的前500个字符创建索引。而且,MyISAM还支持全文索引,但仅限于CHAR、VARCHAR、和TEXT列。

(5) 延迟键写(Delayed key writes):如果创建MyISAM表时指定

数据库三大范式讲解

数据库三大范式说明 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。 实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本节课将对范式进行通俗地说明,以一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际项目中。 范式说明: 第一范式(1NF): 数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。 很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 第二范式(2NF): 数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖

于任意一组候选关键字。 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系: (学号, 课程名称) →(姓名, 年龄, 成绩, 学分) 这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称) →(学分) (学号) →(姓名, 年龄) 即存在组合关键字中的字段决定非关键字的情况。 由于不符合2NF,这个选课关系表会存在如下问题: (1) 数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。 (2) 更新异常: 若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。 (3) 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。 (4) 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。 把选课关系表SelectCourse改为如下三个表: 学生:Student(学号, 姓名, 年龄); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。 这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。 另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

数据库范式练习题

1、请简述满足1NF、2NF和3NF的基本条件。并完成下题:某信 息一览表如下,其是否满足3NF,若不满足请将其化为符合3NF 的关系。(本小题12分) 第一范式的关系应满足的基本条件是元组中的每一个分量都必须是不可分割的数据项。 第二范式,指的是这种关系不仅满足第一范式,而且所有非主属性完全依赖于其主码。 第三范式,指的是这种关系不仅满足第二范式,而且它的任何一个非主属性都不传递依赖于任何主关键字。 考生情况(考生编号,姓名,性别,考生学校)

考场情况(考场号,考场地点) 考场分配(考生编号,考场号) 成绩(考生编号,考试成绩,学分) 2、某信息一览表如下,其是否满足3NF,若不满足请将其化为符 合3NF的关系。(12分) 配件关系:(配件编号,配件名称,型号规格) 供应商关系(供应商名称,供应商地址) 配件库存关系(配件编号,供应商名称,单价,库存量) 3、简述满足1NF、2NF和3NF的基本条件。并完成下题:已知教学关系, 教学(学号,姓名,年龄,性别,系名,系主任,课程名,成绩),试

问该关系的主键是什么,属于第几范式,为什么如果它不属于3NF,请把它规范到3NF。 4、请确定下列关系的关键字、范式等级;若不属于3NF,则将其化为3NF 。 例 1.仓库(仓库号,面积,电话号码,零件号,零件名称,规格,库存数量) 例1答案: 仓库号+零件号;1NF; 仓库(仓库号,面积,电话号码) 零件(零件号,零件名称,规格) 保存(仓库号,零件号,库存数量) 例2. 报名(学员编号,学员姓名,培训编号,培训名称,培训费,报名日期),每项培训有多个学员报名,每位学员可参加多项培训。例2答案: 学员编号+培训编号;1NF;

数据库范式理解例题

范式分解 主属性:包含在任一候选关键字中的属性称主属性。 非主属性:不包含在主码中的属性称为非主属性。 函数依赖: 是指关系中一个或一组属性的值可以决定其它属性的值。函数依赖正象一个函数 y = f(x) 一样,x的值给定后,y的值也就唯一地确定了。 如果属性集合Y中每个属性的值构成的集合唯一地决定了属性集合X中每个属性的值构成的集合,则属性集合X函数依赖于属性集合Y,计为:Y→X。属性集合Y中的属性有时也称作函数依赖Y→X的决定因素(determinant)。例:身份证号→姓名。部分函数依赖: 设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。 完全函数依赖: 在R(U)中,如果Y函数依赖于X,并且对于X的任何一个真子集X',都有Y不函数依赖于X',则称Y对X完全函数依赖。否则称Y对X部分函数依赖。

【例】; 举个例子就明白了。假设一个学生有几个属性 SNO 学号 SNAME 姓名 SDEPT系 SAGE 年龄 CNO 班级号 G 成绩 对于(SNO,SNAME,SDEPT,SAGE,CNO,G)来说,G完全依赖于(SNO, CNO), 因为(SNO,CNO)可以决定G,而SNO和CNO都不能单独决定G。 而SAGE部分函数依赖于(SNO,CNO),因为(SNO,CNO)可以决定SAGE,而单独的SNO也可以决定SAGE。 传递函数依赖: 设R(U)是属性集U上的关系,x、y、z是U的子集,在R(U)中,若x→y,但y→x,若y→z,则x→z,称z传递函数依赖于x,记作X→TZ。 如果X->Y, Y->Z, 则称Z对X传递函数依赖。 计算X+ (属性的闭包)算法: a.初始化,令X+ = X; b.在F中依次查找每个没有被标记的函数依赖,若“左边属性集”包含于X+ ,则令X+ = X+∪“右边属性集”, 并为访问过的函数依赖设置标记。

数据库范式习题答案

Normalization Questions and Answers Database Systems,CSCI4380-01 Sibel Adal? October28,2002 Question1Suppose you are given a relation R=(A,B,C,D,E)with the following functional dependencies:{CE→D,D→B,C→A}. a.Find all candidate keys. b.Identify the best normal form that R satis?es(1NF,2NF,3NF,or BCNF). c.If the relation is not in BCNF,decompose it until it becomes BCNF.At each step,identify a new relation,decompose and re-compute the keys and the normal forms they satisfy. Answer. a.The only key is{C,E} b.The relation is in1NF c.Decompose into R1=(A,C)and R2=(B,C,D,E).R1is in BCNF,R2is in2NF.Decompose R2 into,R21=(C,D,E)and R22=(B,D).Both relations are in BCNF. Question2Suppose you are given a relation R=(A,B,C,D,E)with the following functional de-pendencies:{BC→ADE,D→B}. a.Find all candidate keys. b.Identify the best normal form that R satis?es(1NF,2NF,3NF,or BCNF). c.If the relation is not in BCNF,decompose it until it becomes BCNF.At each step,identify a new relation,decompose and re-compute the keys and the normal forms they satisfy. Answer. a.The keys are{B,C}and{C,D} b.The relation is in3NF c.It cannot be put into BCNF,even if I remove D and put into a relation of the form(B,C,D)(I need C for the functional dependency),the resulting relation would not be in BCNF. Question3Suppose you are given a relation R=(A,B,C,D,E)with the following functional de-pendencies:BD→E,A→C. a.Show that the decomposition into R1=(A,B,C)and R2=(D,E)is lossy.You can show using any method.My suggestion is to show how spurious tuples result from this decomposition with respect to the table below: A B C D E 12345 18344 1

数据库三范式

数据库三范式 1.1 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 1.2 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖] 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。 1.3 第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖] 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。 II、范式应用实例剖析 下面以一个学校的学生系统为例分析说明,这几个范式的应用。首先第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS 中设计出不符合第一范式的数据库都是不可能的。 首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程、

数据库原理复习题1

一、填空 1.目前,数据库系统支持的主要数据模型有__层次__模型、__网状__模型和关系模型。 2.与文件系统相比较,数据库系统的冗余度__小__,数据共享性__高___。3.关系模型的三类完整性是__实体完整性__、__参照完整性__和用户自定义完整性。若基本关系R中含有与另一个基本关系S的主码Ks相对应的属性组F,则对于R中每一个元组在F上的值必须为_空值___或者_S中主码某个值 __。4.由于数据库系统在三级模式之间提供了__外模式/模式_和__模式/内模式__两层映象功能,这就保证了数据库系统具有较高的数据独立性。 5.1NF的关系消除__非主属性对码的部分函数___依赖后,可将范式等级提高到2NF。2NF的关系消除__非主属性对码的传递函数___依赖后,可将范式等级提高到3NF。 6.E-R图的主要元素是实体、属性和_实体之间的联系___。 7.关系代数中专门的关系运算包括:选择、投影、__连接___和__除__。 8.SQL语言中的GRANT语句的功能是__授权__;REVOKE语句的功能是__收回权限__。 9.数据库的逻辑模型设计阶段,任务是将_E-R模型___转换成关系模型。 二、选择 1.关系模型中,同一个表中的不同属性命名( C ) A.可相同 B.必须相同 C.必须不同 D.可相同,但数据类型不同2.逻辑数据独立性是指( B ) A.模式变,用户不变 B.模式变,应用程序不变 C.应用程序变,模式不变 D.子模式变,应用程序不变 3.进行自然联接运算的两个关系必须具有( B ) A.相同属性个数 B.公共属性 C.相同关系名 D.相同关键字4.数据库具有( D ),最小冗余,较高的数据独立性和易于扩充等特点。 A.程序结构化 B.程序标准化 C.数据模块化 D.数据结构化 5. 任何由二个属性组成的关系( D ) A.可能为1NF B.可能为2NF C.可能为3NF D.必为3NF 6.数据库管理系统是位于____之间的一层数据管理软件。( B ) A.硬件与软件 B.用户与操作系统 C.硬件与操作系统 D.数据库与操作系统 7.数据库中,层次模型( A ) A.有且仅有一个结点无双亲,其他结点有且仅有一个双亲 B.有一个以上结点无双亲 C.每个结点都无双亲 D.有一个结点有多于一个双亲 8.一个关系中的候选关键字( B ) A.至多一个 B.可多个 C.必须多个 D.至少3个 9. 在数据库技术中,独立于计算机系统的模型是( A ) A.E-R模型 B.层次模型

数据库中三个范式的理解

什么是范式 简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准,满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf) DEMO 让我们先从一个未经范式化的表看起,表如下: 先对表做一个简单说明,employeeId是员工id,departmentName是部门名称,job代表岗位,jobDescription是岗位说明,skill是员工技能,departmentDescription是部门说明,address是员工住址 对表进行第一范式(1NF) 如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。 简单的说,第一范式就是每一个属性都不可再分。不符合第一范式则不能称为关系数据库。对于上表,不难看出Address是可以再分的,比如”北京市XX路XX小区XX号”,着显然不符合第一范式,对其应用第一范式则需要将此属性分解到另一个表,如下:

对表进行第二范式(2NF) 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF 简单的说,是表中的属性必须完全依赖于全部主键,所以只有一个主键的表如果符合第一范式,那一定是第二范式,而不是部分主键。这样做的目的是进一步减少插入异常和更新异常。在上表中,departmentDescription是由DepartmentName所决定,但却不能由EmployeeID 决定,故要departmentDescription对主键是部分依赖,对其应用第二范式如下表: 对表进行第三范式(3NF)

关系模式R 中若不存在这样的码X、属性组Y及非主属性Z(Z Y), 使得X→Y,Y→Z,成立,则称R ∈ 3NF。 简单的说,第三范式是为了消除数据库中关键字之间的依赖关系,在上面经过第二范式化的表中,可以看出jobDescription(岗位职责)是由job(岗位)所决定,则jobDescription依赖于job,可以看出这不符合第三范式,对表进行第三范式后的关系图为: 上表中,已经不存在数据库属性互相依赖的问题,所以符合第三范式

数据库范式(1NF2NF3NFBCNF)详解

数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、 结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。 范式说明 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不 能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一 对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式 就是无重复的列。 说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一 范式(1NF)的数据库就不是关系数据库。 例如,如下的数据库表是符合第一范式的: 字段1 字段2 字段3 字段4 而这样的数据库表是不符合第一范式的: 字段1 字段2 字段3 字段4 字段字段 数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、 实数、字符型、逻辑型、日期型等。很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一 列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不 可能的。 第二范式(2NF)属性完全依赖于主键[ 消除部分子函数依赖] 如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被 惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。 例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的, 因此每个员工可以被惟一区分。

数据库范式理解例题

范式分解 主属性: 包含在任一候选关键字中得属性称主属性。 非主属性: 不包含在主码中得属性称为非主属性。 函数依赖: 就是指关系中一个或一组属性得值可以决定其它属性得值。函数依赖正象一个函数y =f(x) 一样,x得值给定后,y 得值也就唯一地确定了。 如果属性集合Y中每个属性得值构成得集合唯一地决定了属性集合X中每个属性得值构成得集合,则属性集合X函数依赖于属性集合Y,计为:Y→X。属性集合Y中得属性有时也称作函数依赖Y→X得决定因素(determinant).例:身份证号→姓名。 部分函数依赖: 设X,Y就是关系R得两个属性集合,存在X→Y,若X’就是X得真子集,存在X’→Y,则称Y部分函数依赖于X。 完全函数依赖: 在R(U)中,如果Y函数依赖于X,并且对于X得任何一个真子集X’,都有Y不函数依赖于X', 则称Y对X完全函数依赖。否则称Y对X部分函数依赖。 【例】;

举个例子就明白了。假设一个学生有几个属性 SNO 学号SNAME 姓名SDEPT系 SAGE 年龄CNO班级号G 成绩 对于(SNO,SNAME,SDEPT,SAGE,CNO,G)来说,G完全依赖于(SNO,CNO),因为(SNO,CNO)可以决定G,而SNO与CNO都不能单独决定G。 而SAGE部分函数依赖于(SNO,CNO),因为(SNO,CNO)可以决定SAGE,而单独得SNO也可以决定SAGE。 传递函数依赖: 设R(U)就是属性集U上得关系,x、y、z就是U得子集,在R(U)中,若x→y,但y→x,若y→z,则x→z,称z传递函数依赖于x,记作X→TZ。 如果X—>Y, Y—〉Z, 则称Z对X传递函数依赖。 计算X+(属性得闭包) 算法: a、初始化,令X+ = X; b、在F中依次查找每个没有被标记得函数依赖,若“左边属性集”包含于X+,则令 X+ = X+∪“右边属性集",并为访问过得函数依赖设置标记。 c、反复执行b直到X+不改变为止。 检验给定得任意函数依赖A1A2、、、An->B就是否蕴含于依赖集S: 分析:

数据库习题答案-3

《数据库习题答案》来自五星文库 点这里,有很多篇《数据库习题答案》 在线阅读本文: 数据库习题答案 导读:第三章习题,1.关系数据库设计理论,数据依赖范式和关系模式的规范化设计方法,其中数据依赖起着核心的作用,2.关系数据库中的关系模式至少要满足第一范式,如果每个属性值都是不可再分的最小数据单位,(2)试分析模式R的数据冗余问题,关系R中的C属性会存在在数据冗余,相应地原来存储在一张二维表内的数据就要分散存储到多张二维表中,第四章习题,A删除基本表B修改基本表中的数据,A数据项B 元组,C表D数据库 第三章习题 一、单项选择题 1.在关系模型R中,函数依赖X→Y的语义是(B )A.在R的某一关系中,若两个元组的X值相等,则Y值也相等 B.在R的每一关系中,若两个元组的X值相等,则Y值也相等 C.在R的某一关系中,X值应与Y值相等 D.在R的每一关系中,X值应与Y值相等 2.设学生关系模式为:学生(学号,姓名,年龄,性别,成绩,专业),则该关系模式的主键是( B ) A.性别B.学号 C.学号,姓名D.学号,姓名,性别 3.如果X→Y(Y不包含于X,且Y不能决定X)和Y→Z成立,那么X→Z成立。这条规则称为( B ) A.自反律B.传递律 C.伪传递律D.增广律

4.关系模式R2NF,则R一定是(b ) A.1NF B.3NF C.BCNF D.4NF 5.设一关系模式为:运货路径(顾客姓名,顾客地址,商品名,供应商姓名,供应商地址),则该关系模式的主键是( C )A.顾客姓名,供应商姓名,供应商地址B.顾客姓名,商品名 C.顾客姓名,供应商姓名,商品名D.顾客姓名,顾客地址 6.下列有关范式的叙述中正确的是(B ) A.如果关系模式R1NF,且R中主属性完全函数依赖于主键,则R是2NF B.如果关系模式R3NF,则R2NF一定成立 C.如果关系模式R1NF,则只要消除了R中非主属性对主键的传递依赖,则R可转换成2NF D.如果关系模式R1NF,则只要消除了R中非主属性对主键的部分依赖,则R可转换成3NF 7.关系模式学生(学号,课程号,名次),若每一名学生每门课程有一定的名次,每门课程每一名次只有一名学生,则以下叙述中错误的是( B ) A.(学号,课程号)和(课程号,名次)都可以作为候选键B.只有(学号,课程号)能作为候选键 C.该关系模式属于第三范式 D.该关系模式属于BCNF 8.已知关系模式R(ABCD),F={A→C,B→C,C→D },则以下成立的是( B ) A.A→B B.A→D C.AD→BC D.AC→BD 9.如果X→Y且ZU成立,那么XZ→YZ成立,这条规则称为(D )A.自反律B.传递律` C.伪传递律D.增广律

数据库-部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别

数据库-部分函数依赖,传递函数依赖,完全函数依赖, 三种范式的区别 要讲清楚范式,就先讲讲几个名词的含义吧: 部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。 举个例子:学生基本信息表R中(学号,身份证号,姓名)当然学号属性取值是唯一的,在R关系中,(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);所以姓名部分函数依赖与(学号,身份证号); 完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。例子:学生基本信息表R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在R关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不成立,(班级)->(姓名)不成立,所以姓名完全函数依赖与(学号,班级); 传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。 例子:在关系R(学号 ,宿舍, 费用)中,(学号)->(宿舍),宿舍!=学号,(宿舍)->(费用),费用!=宿舍,所以符合传递函数的要求;

在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 所谓第一范式(1NF)是指数据库表的每一列(即每个属性)都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,第一范式就是无重复的列。 2、第二范式(2NF) 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性依赖于主关键字。

数据库复习资料数据库范式(1NF 2NF 3NF BCNF)详解

数据库范式(1NF 2NF 3NF BCNF)详解 数据结构设计模式编程制造 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。 范式说明 1.1 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 包括整型、实数、字符型、逻辑型、日期型等。很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS 中设计出不符合第一范式的数据库都是不可能的。 1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R 的某个候选键,则称为第二范式模式。 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。 例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。 简而言之,第二范式(2NF)就是非主属性完全依赖于主关键字。 所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖 W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖)。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系: (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

数据库的三个范式

数据库规范化三个范式应用实例 5. 通俗地理解三个范式 通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解): 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性; 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余. 没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。 规范化为什么重要?目前很多的数据库由于种种原因还没有被规范化。本文中解释了其中一些原因,并用不同形式的范式(normal form)规范化了一个保险公司的理赔表。在这个过程中表的改变以及添加的一些附加表使数据库效率更高、错误更少、更容易维护。 数据库的规范化是优化表的结构和把数据组织到表中的实践,这样做数据才能更明确。规范化使你能够改变业务规则、需求和数据而不需要重新构造整个系统。 通过改变存储数据的方式--仅仅改变一丁点--并改变访问这些信息的程序,你就可以消除很多错误或垃圾数据出现的机会并减轻更新信息所必要的工作量。 公司现实存在的一个问题可以用一句话概括"我们一般都这样做"。我们一般像采用那种方式存储信息;我们一般允许人们把任何信息写入;我们一般采用那种方式编程。这通常是一件坏事,特别是对于年轻的和正在学习的公司来说。但是,当有新的系统和更好的完成任务的途径的时候,有时"采用那种方式任务完成得很好"这句话可能需要重新探讨和修改。规范化数据就是公司常常采用的有益的方式之一。 尽管对于cobol程序(例如任何cobol程序员都熟悉的文件布局)使用数据来说,把它们(数据)存储在关系数据库中与存储在平面文件中很相似,但是存储在平面文件中的方法并不是完成任务的必要的最好的途径,特别是由于你不了解两者之间的差别或害怕改变,而简单地把过去的观念带入到现在的方式。 注意:https://www.doczj.com/doc/7215075434.html,是这样定义规范化的:"使其标准,特别使导致它符合某种标准或规范。"或"某种标准的强制接受"。webopedia认为规范化是"在关系数据库设计中,组织数据以最小化冗余的过程。规范化通常包括把一个数据库分成两个或多个表并定义表之间的关系。其目标是隔离数据,这样添加、删除和修改某个字段只需要在一个表中进行,接着可以通过定义的关系传递到数据库中剩余的表中"。我更喜欢这个定义。 术语 在你了解现实世界中的一个保险公司的例子之前,你需要了解一些在讨论中会用到的术语。处理数据库的时候,特别是在处理规范化问题的时候,下面一部分讲到的一组新的关键字很有作用: ·关系(relation):从本质上说,关系是一个包含行和列的二维表或数组。 ·关联(relationship):关联是不同表之间的数据彼此联系的方法。关联同时存在于形成不同实体的数据项之间和表实体本身之间,构成了数据库规范化的基本核心问题。数据关联有三种基本的类型,对它们有所了解是很重要的:

数据库三大范式详解

数据库三大范式详解 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。 说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。 第二范式(2NF)属性 在1NF的基础上,非码属性必须完全依赖于主键[在1NF基础上消除非主属性对主码的部分函数依赖] 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加时在ER设计时添加,不是建库是随意添加) 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之

数据库范式练习题

数据库范式练习题

1、请简述满足1NF、2NF和3NF的基本条件。并完成下题:某信息一览表 如下,其是否满足3NF,若不满足请将其化为符合3NF的关系。(本小题12分) 第一范式的关系应满足的基本条件是元组中的每一个分量都必须是不可分割的数据项。 第二范式,指的是这种关系不仅满足第一范式,而且所有非主属性完全依赖于其主码。 第三范式,指的是这种关系不仅满足第二范式,而且它的任何一个非主属性都不传递依赖于任何主关键字。 考生情况(考生编号,姓名,性别,考生学校) 考场情况(考场号,考场地点) 考场分配(考生编号,考场号) 成绩(考生编号,考试成绩,学分) 2、某信息一览表如下,其是否满足3NF,若不满足请将其化为符合3NF的关系。(12分) 配件关系:(配件编号,配件名称,型号规格)

供应商关系(供应商名称,供应商地址) 配件库存关系(配件编号,供应商名称,单价,库存量) 3、简述满足1NF、2NF和3NF的基本条件。并完成下题:已知教学关系, 教学(学号,姓名,年龄,性别,系名,系主任,课程名,成绩),试问该关系的主键是什么,属于第几范式,为什么?如果它不属于3NF,请把它规范到3NF。 4、请确定下列关系的关键字、范式等级;若不属于3NF,则将其化为3NF 。例1.仓库(仓库号,面积,电话号码,零件号,零件名称,规格,库存数量)例1答案: 仓库号+零件号;1NF; 仓库(仓库号,面积,电话号码) 零件(零件号,零件名称,规格) 保存(仓库号,零件号,库存数量) 例2. 报名(学员编号,学员姓名,培训编号,培训名称,培训费,报名日期),每项培训有多个学员报名,每位学员可参加多项培训。 例2答案: 学员编号+培训编号;1NF; 学员(学员编号,学员姓名) 培训(培训编号,培训名称,培训费) 报名(学员编号,培训编号,报名日期)

数据库设计范式

数据库设计三大范式 引言 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。 范式说明 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。 例如,如下的数据库表是符合第一范式的: 而这样的数据库表是不符合第一范式的: 很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系: (学号, 课程名称) →(姓名, 年龄, 成绩, 学分) 这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称) →(学分) (学号) →(姓名, 年龄) 即存在组合关键字中的字段决定非关键字的情况。

由于不符合2NF,这个选课关系表会存在如下问题: (1) 数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。 (2) 更新异常: 若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。 (3) 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。 (4) 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。 把选课关系表SelectCourse改为如下三个表: 学生:Student(学号, 姓名, 年龄); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。 这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。 另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B →C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段→非关键字段x →非关键字段y 假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

数据库三种范式

数据库的三个范式 第一范式:关系模式中,每个属性不可再分。属性原子性 第二范式:非主属性完全依赖于主属性,即消除非主属性对主属性的部分函数依赖关系。第三范式:非主属性对主属性不存在传递函数依赖关系。 BNCF范式:在第三范式的基础上,消除主属性之间的部分函数依赖 关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍。在你设计数据库之时,若能符合这几个范式,你就是数据库设计的高手。 第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值都是不可再分的最小数据单位,则称R是第一范式的关系。例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话和一个家里电话号码)规范成为1NF有三种方法: 一是重复存储职工号和姓名。这样,关键字只能是电话号码。 二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性 三是职工号为关键字,但强制每条记录只能有一个电话号码。 以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。 第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。 例:选课关系SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号,CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。由以上条件,关键字为组合关键字(SNO,CNO) 在应用中使用以上关系模式有以下问题: a.数据冗余,假设同一门课由40个学生选修,学分就重复40次。 b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。 c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。 d.删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。 原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。 解决方法:分成两个关系模式SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系 第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。 例:如S1(SNO,SNAME,DNO,DNAME,LOCATION)各属性分别代表学号, 姓名,所在系,系名称,系地址。 关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。 原因:关系中存在传递依赖造成的。即SNO -> DNO。而DNO -> SNO却不存在,DNO -> LOCATION, 因此关键辽SNO 对LOCATION 函数决定是通过传递依赖SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。

相关主题
文本预览
相关文档 最新文档