三大范式与存储过程

1.三大范式

第一范式:字段属性单一,不可再分

第二范式:第一范式的基础上,加上所有非主属性完全依赖于主属性,即不存在部分依赖。

完全依赖,一个属性a能够确定另一个属性b,b->a,b完全依赖于a,如果(a,b)->c,并且b也能确定c,那么

就称c部分依赖于(a,b);这样就不符合第二范式;

例如:订单表中,含有订单id,产品id,产品名称;通过订单id和产品id能确定整条记录,那么就可以将(订单id,产品id)作为订单表的联合主键,即(订单id,产品id)->产品名称,但是产品id也能确定产品名称。因此产品名称部分依赖于(订单id,产品id);不符合第二范式

第三范式:不存在传递依赖

传递依赖:a->b( ! b->c),b->c,得出a->c 那么就称c传递依赖于a;

存在下面属性

学号 姓名 宿舍楼 宿舍楼位置;学号->宿舍楼,宿舍楼!->学号,宿舍楼->宿舍楼位置;则存在传递依赖学号->宿舍楼位置

不符合第三范式

2.存储过程

概念:是一组为了完成特定功能的sql语句集,经编译后存储在数据库中。存储过程是数据库的一个重要对象,用户通过指定存储过程的名字并给出参数(如果存储过程带参数)来执行;存储过程是由流控制和sql语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。存储过程可由应用程序通过一个调用来执行,允许声明变量。同时,存储过程可以接受和输出参数、返回执行存储过程的状态值,可以嵌套使用。

存储过程的优点

①大大增强了sql语言的功能和灵活性

用流控制语句编写,有很强的灵活性

②可保证数据的安全性和完整性

通过存储过程可以使没有权限的用户在控制之下间接的存取数据库或者没有权限不能存储数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,维护数据库的完整性

③在运行存储过程前,数据库已对其进行语法分析,并给出了优化执行方案。

这种编译好的过程极大的改善sql语句的性能。

由于执行sql语句的大部分工作已经完成,所以存储过程能以极快的速度运行。

④可以降低网络的通信量。

客户端调用存储过程只需要传存储过程名和相关参数即可,与传sql语句相比自然数据量少了很多。

⑤使体现企业规则的运算程序放入数据库服务器中,以便:

集中控制,当企业规则发生变化时,在服务器中改变存储过程即可,无修改任何应用程序

优点概括:

①存储过程只在创造时进行编译,以后每次执行存储过程都不需要重新编译,提高效率

②复杂操作,可以将其用存储过程封装起来与数据库提供的事务处理结合一起用

③存储过程可以重复使用,可减少开发人员工作量

④安全性高,可设定只有某些用户才能执行存储过程

缺点:

①代码是运行前编译的,所以当引用对象或者代码发生改变时,需要重新进行编译

②如果程序中大量使用存储过程,随着用户需求的增加,导致数据结构的变化,维护需要很大代价。

--创建带output参数的存储过程 
CREATE PROCEDURE PR_Sum 
    @a int, 
    @b int, 
    @sum int output
AS
BEGIN
    set @sum=@a+@b 
END
  
--创建Return返回值存储过程 
CREATE PROCEDURE PR_Sum2 
    @a int, 
    @b int
AS
BEGIN
    Return @a+@b 
END
      
--执行存储过程获取output型返回值 
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum 
  
--执行存储过程获取Return型返回值 
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2 
print @mysum2

猜你喜欢

转载自blog.csdn.net/huangwei18351/article/details/81514163