zoukankan      html  css  js  c++  java
  • 第三十二章——数据库打包和三大范式

    package程序包和程序体

    package---包头
    package body---包体

    dbms_output.put_line();
    上面的输出语句就是一个程序包加存储过程
    dbms_output是包的名字, 调用里面的某个方法

    包头的语法:
    create or replace package 包头名 as
    变量的说明...
    存储过程或者函数的声明(不需要写实现的代码块)
    end;

    声明了一个包头, 就要有一个包体与之对应, 去实现包头中写明的存储过程或者函数

    包体的语法:
    create or replace package body 包体名(这里的这个包体名要和上面定义的包头名字一模一样) as
    存储过程或者函数的实现...
    end;

    调用过程:
    declare

    begin
    包头名.存储过程名或者函数名
    end;

    代码示例:

    create or replace package print_stu is
    
           TYPE stucursor IS REF CURSOR;
           
           --CURSOR ss IS SELECT.........
           
           PROCEDURE aaaaa(snum IN NUMBER);
           PROCEDURE put_stuinfo(sclass IN NUMBER, stuinfo OUT stucursor);
           
    end print_stu;
    /
    create or replace package body print_stu is
    
           PROCEDURE aaaaa(snum IN NUMBER) AS
             s_name student.sname%TYPE;
             BEGIN
               SELECT s.sname INTO s_name FROM student s WHERE s.sno=snum;
               dbms_output.put_line(s_name);
             END;
             
           PROCEDURE put_stuinfo(sclass IN NUMBER, stuinfo OUT stucursor) AS
             BEGIN
                     OPEN stuinfo FOR SELECT * FROM student s WHERE s.class=sclass;
             END;
    end print_stu;
    /


    oracle三大范式
    范式: 就是一个设计数据库定义的一个规则, 为什么叫范式, 因为想出来的这个人姓范

    三大范式, 灵活运用, 人的思想是活的
    一范式
    1, 不存在冗余数据
    同一个表中的记录不能有重复----所以主键(必须有)
    2, 每个字段必须是不可再分的信息(列不可再分)
    根据具体情况, 比如一个身份证号, 保存了许多信息, 但实际上把身份证号整个保存下来就可以了, 这个时候没必要再分了
    另一种情况, 需要存两个同样类型的数据, 也是根据具体情况, 再细分
    信息的冗余另一种情况:
    一个字段是年龄, 一个字段是生日, 信息内容的冗余
    二范式(前提: 首先符合第一范式):
    消除部分依赖
    主要是针对多对多关联的表

    第三范式(前提: 首先满足第二范式):
    消除传递依赖
    主要是针对于 一对多的关系
    数据库建表三大范式
    1 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、 删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不 需要的冗余信息。

    2 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型 、日期型等。
    3 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些 字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
    4 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段ss对任一候选关键字段的传递函数依赖则符合第三范式。所 谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依 赖关系: s 关键字段 → 非关键字段x → 非关键字段y

    以上为三大范式官方版

    以下为自己的理解:
    三大范式:
    第二范式,消除部分依赖。。
    理解:假如一个表有一个联合主键,拿其中一列当作外键连接其他表,而这一列不能独自决定这个表,所以会依赖另外一个主键来决定这个表,为了消除这种部分依赖,用中间表连接。
    第三范式,消除传递依赖。。 连接 依赖 主键1外键 依赖 主键2
    理解:假如一个表有一个主键,用另外一个表非主键作为外键连接,并不能决定另外一个表,还要依赖另一个表的主键来决定,这样就会出现 连接 依赖 非主键外键 依赖 外表主键
    为了消除传递依赖,所以用另外一个表的主键作为外键连接。

  • 相关阅读:
    面向对象
    Spring学习(十四)----- Spring Auto Scanning Components —— 自动扫描组件
    Spring学习(十三)-----Spring 表达式语言(Spring EL)
    Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例
    Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例
    学习计划
    Spring学习(十一)-----Spring使用@Required注解依赖检查
    Spring学习(十)-----Spring依赖检查
    Spring学习(九)-----Spring bean配置继承
    Spring学习(八)-----Spring注入值到集合类型的例子
  • 原文地址:https://www.cnblogs.com/yuanlaihenkuang/p/7109457.html
Copyright © 2011-2022 走看看