数据库表优化与设计

一、约束

数据完整性的基本概念 
数据完整性指数据库中的数据的正确性、一致性和有效性,数据完整性规则通过数据完整性约束来实现。在MySQL中,各种完整性规则作为表的定义的一部分,可通过CREATE TABLE语句或ALTERTABLE语句来定义。
数据完整性分为几个不同的层次来定义:
1、实体完整性(行完整性)
实体完整性要求表中有一个主键,其值不能为空且能唯一地标志对应的记录,又被称为行完整性。通过PRIMARYKEY约束、UNIQUE约束实现数据的实体完整性。PRIMARYKEY约束定义主键,一个表只能有一个PRIMARYKEY约束,且PRIMARYKEY约束不能为空值。通过UNIQUE约束定义唯一性约束,为了保证一个表的非主键列不输入重复值,可在该列定义UNIQUE约束。

2、域完整性(列完整性) 
域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值等。可以使用CHECK约束、UNIQUE约束、default默认值、identity自增、not null/null保证列的值域的完整性。

3、参照完整性(引用完整性)
参照完整性保证被参照表中的数据与参照表中数据的一致性,又称为引用完整性,参照完整性确 保键值在所有表中一致,通过定义主键(PRIMARYKEY)与外键(FOREIGNKEY)之间的对应关系实现参照完整性。 
(1)主键:表中能唯一标识每个数据行的一个或多个列
(2)外键:一个表中的一个或多个列是另一个表的主键。

用户定义的完整性 
用户定义的完整性指列数据输入的有效性,通过CHECK约束、NOTNULL约束实现完整性约束,数据完整性规则通过完整性约束来实现,完整性约束是在表上强制执行的一些数据校验规则,在 插入、修改或者删除数据时必须符合在相关字段上设置的这些规则,否则报错。
PRIMARYKEY约束,主键约束,实现实体完整性。
UNIQUE约束,唯一性约束,实现实体完整性
FOREIGNKEY约束,外键约束,实现参照完整性。
CHECK约束,检查约束,实现用户定义的完整性。
NOT NULL约束,非空约束,实现用户定义的完整性。


外键约束注意点:
CASCADE:级联
(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。 
(2)以学生表的例子来说明,假如主表中的某个学生被删除了,那么在子表中要想查询这个被删除的学号所对应的成绩信息就会报错,因为已经不存在这个学生了,所以,删除主表时必须删 除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除子表中的记录,并不影响主表中的数据,主表查询学号也能正确查询。所以删除外键表中的数据并不影响主键表。
NO ACTION(非活动,默认)、RESTRICT:约束/限制
当取值为No Action或者Restrict时,则当在主表中删除对应记录时,首先检查该记录是否索引类型 
有对应外键,如果有则不允许删除。(即外键表约束主键表)
NO ACTION和RESTRIC7的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。
SET NULL
当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键如果有则设置子表中该外键值为null)。 

二、视图

视图的作用 
视图是一种常用的数据库对象,可以把它看成从一张或几张源表导出的虚表或存储在数据库中的查询。对于视图所引用的源表来说,视图的作用类似于筛选。筛选的数据可以来自当前或其他数据库的一张或多张表,也可以来自其他视图。

视图与数据表不同,数据库中只存放视图的定义,即SQL语包,而不存放视图对应的数据,数据存放在源表中,当源表中的数据发生变化时,从视图中查询出的数据也会随之改变。对视图进行操作时系统会根据视图的定义去操作与视图相关联的数据表。视图一经定义后,就可以像源表一样被查询、修改和删除。

视图具有以下优点:
屏蔽数据库的复杂 
简化操作性 
便于数据共享 
提高数据安全
数据即时更新

视图对性能的影响

实现视图最简单的方法是将select语句的结果存放到临时表中。当需要访问视图的时候。直接访问临时表就可以。比如:select Code.Name from Oceania where Name='Australia':
在实现上述查询时,有两种方式去实现,一种是使用临时表,还有一种是重写含有视图的查询,将视图的定义SQL直接包含进查询的SQL中:
>使用临时表算法:
create temporary table TMP Oceania 123 as select*from Country where Continent='Oceania
select Code. Name from TMPOceania 123where Name=Australia'.
>使用合并算法的:
select Code. Name from Country where Continent='Oceaniaand Name ='Australia'

使用临时表算法实现的视图,在某些时候性能会很糟糕(可能比直接使用等效查询语句要好一点)。MySQL会以递归的方式执行这些视图,先会执行外层查询,即使外层查询优化器将其优化的很好,但是,内外结合的优化却无法做到非常好。如果打算使用视图来提升性能,需要做比较详细的测试。即便是合并算法实现的视图也会有额外的开销,而且使性能很难预测。

你可能感兴趣的:(数据库,java,mysql)