我的编程空间,编程开发者的网络收藏夹
学习永远不晚

最全的Oracle-SQL笔记(8)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

最全的Oracle-SQL笔记(8)

1.8、数据库设计范式

数据库设计范式实际上非常的重要,但是从实际的开发来看,如果真的全部按照范式去做,则这个程序没法写,包括查询语句也会变得复杂。

在Oracle中的scott用户的全部表,实际上就已经很好的体现了一张设计思路,雇员-部门的关系。

1) 第一范式

例如,现在假设有如下的数据库创建脚本

create table person(

pid number(4) primary key not null,

name varchar2(50),

info varchar(200)

);

插入以下测试数据

insert into person(pid,name,info) values(1111,'张三','1983年11月23日出生,现在的住址是:北京市西城区。。。。。');

实际上对于人员来看,由以下几部分组成:

|-生日:1983年1月23日

|-省市:北京

|-地区:西城区

|-详细的信息:。。。。。

每个字段不可再分,所以,以上的数据库创建脚本修改如下:

create table person(

pid number(4) primary key not null,

name varchar2(50),

birthday date,

area varchar2(200),

subarea varchar2(200),

address varchar2(200)

);

这种设计看上去每个字段是不可再分的,但是我们应该会注意到,在一些网站的注册中,会要求用户分别输入“姓”和“名”,所以,可将上面的设计修改如下:

create table person(

pid number(4) primary key not null,

姓 varchar2(50),

名 varchar2(50),

birthday date,

area varchar2(200),

subarea varchar2(200),

address varchar2(200)

);

所以,在设计表字段的时候,最好保证每个字段均不能再分。

2) 第二范式

第一范式的要求非常简单,保证每个字段有意义。但是如果所有的操作都使用第一范式,那么会存在问题:

现在建立一张学生选课表:学号、姓名、年龄、课程名称、成绩、学分

create table selectcourse(

stuno varchar2(50),

stuname varchar2(50),

stuage number,

cname varchar2(50),

grade number,

credit number

);

以上的脚本符合第一范式的要求,但是如果按照第一范式设计的话,会存在问题:

insert into selectcourse values('s001','张三',21,'JAVA',89,0.3);

insert into selectcourse values('s001','李四',20,'JAVA',78,0.3);

insert into selectcourse values('s001','王五',23,'JAVA',80,0.3);

insert into selectcourse values('s001',赵六',22,'JAVA',90,0.3);

从以上的数据库脚本上可以发现,所有的课程信息冗余了,而且还存在以下问题:

|-如果一门课程没有一个学生选择,则此而成就从学校彻底消失了

|-课程中本身也应该包含一个课程的编号,但是如果按照以上的设计,则课程编号肯定重复

|-如果要更改课程信息,则要更改许多条记录

我们使用第二范式修改数据库脚本:

|-学生是一个实体--学生表

create table student(

stuno varchar2(50) primary key not null,

stuname varchar2(50),

stuage number

);

|-课程也应该是一个实体--课程表

create table course(

cid number(5) primary key not null,

cname varchar2(50),

credit number

);

|-学生选课信息也是一个实体--学生选课表

create table selectcourse(

stuno varchar2(50),

cid number(5),

grade number,

加入外键关联,因为学生没了,成绩就没了,因为课程没了,成绩就没了

);

以上设计解决了以下问题:

|-学生不选课的时候,课程信息不会消失

|-更新课程的时候直接更新课程表即可

|-所有的关联关系在关系表中体现。

3) 第三范式

在实际开发中,第三范式的使用是最多的。

例如,现在要求设计一张学生表,包含学号、姓名、年龄、所在院校、学院地址、学院电话,此时肯定不能使用第一范式,但是现在如果使用的是第二范式呢?

create table student(

stuno varchar2(50) primary key not null,

stuname varchar2(50),

stuage number

);

create table collage(

cid number(4) primary key not null,

cname varchar2(50) not not null,

caddress varchar2(200) not nul,

ctel varchar2(200) not null

);

create table studentcollage(

stuno varchar2(50),

cid number(4),

设置主-外键关系

);

按照上面的设计,一个学生可以同时在多个学院同时上课,多个学院会同时有同一个学生,此时,最好的做法是:一个学院包含多个学生,一个学生属于一个学院,实际上,此设计就完全类似于部门和雇员表的设计结构。

create table collage(

cid number(4) primary key not null,

cname varchar2(50) not not null,

caddress varchar2(200) not nul,

ctel varchar2(200) not null

);

create table student(

stuno varchar2(50) primary key not null,

stuname varchar2(50),

stuage number,

cid number(4),

建立主-外键关系

);

该设计是一个很明确的一对多的关系设计。

数据库的唯一原则:

|-数据库表的关联查询越少越好,SQL语句的复杂度越低越好。

1.9、数据库设计工具

在实际中数据库也有自己的设计工具,比较常用的就是Sybase的PowerDesigner开发工具,此工具可以方便的做各种设计,启动之后,可以使用此工具,进行数据库的建模设计。

启动PowerDesigner后,选择新建,Physical Data Model,选择Oracle数据库

下面使用PowerDesigner工具将Oracle中的dept和emp表进行还原

创建表--在工具中进行主-外键的操作--得到关系之后,就可以通过Powerdesigner工具进行数据库脚本的创建了。

1.10、数据库设计分析

1) 要求

设计要求,要求设计一个网上购物程序(使用Powerdesigner建立模型并编写测试数据),有以下的需求

|-管理员可以再后台添加商品,每个商品属于一个商品组

|-可以对管理员进行分组,对每一组进行分别授权,即一个管理员组可以有多个管理员,一个管理员组有多个权限,一个管理员可以再多个组

|-用户可以自己购买商品,购买商品时要在订单表中添加信息,一个用户可以同时购买多个商品,用户可以选择自己所在的地区进行商品的派送

|-用户可以根据自己的购买积分,对商品进行折扣

2) 实现

根据第一个要求,一个商品属于一个商品组,则此时应该建立一个“一对多”的关系

根据第二个要求,可以对管理员进行分组,需要管理员表、管理员组表、权限表、管理员-管理员组表、管理员组-权限表

管理员和商品表也要存在关系

需要一个用户表,与其产生关系的有地区表、子地区表、订单表、订单详情表、积分表

正常情况下,一份订单肯定会按照以上的格式显示,那么请问,这样一来要查询多少张表?

|-用户表(用户姓名、用户电话、用户地址)

|-地区表-子地区表(用户地区)

|-订单表、订单详情表(商品总价、订单日期、邮政编码)

本查询需要同时查询6张表。本程序中的所有代码都是按照标准范式完成的,所以此时出现了以上的问题。

在开发中减少多表查询的方法可以通过冗余数据完成。</pre>

<p> </p>

<pre name="code" >Oracle 笔记

1

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

最全的Oracle-SQL笔记(8)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL学习笔记(23):SQL安全

本文更新于2019-06-29,使用MySQL 5.7,操作系统为Deepin 15.4。应用可使用PrepareStatement + Bind-Variable来防止SQL注入。已知的非法符号有:()[]--#;="+空格%
MySQL学习笔记(23):SQL安全
2016-09-18

java大数据最全课程学习笔记(2)-

目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages目录Hadoop完全分布式运行模式步骤分析:编写集群分发脚本xsync集群配置集群部署规划配置集群集群单点启动SSH无密登陆配置登录状态的环境变量群起集群集群启动/停止方式总结集群
java大数据最全课程学习笔记(2)-
2021-07-11

java大数据最全课程学习笔记(5)-

目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages目录MapReduce精通(一)MapReduce入门MapReduce定义MapReduce优缺点优点缺点MapReduce核心思想MapReduce进程MapReduce编程规
java大数据最全课程学习笔记(5)-
2019-07-21

java大数据最全课程学习笔记(4)-

目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages目录HDFS NN,2NN,DN及HDFS2.x新特性NameNode和SecondaryNameNode(重点)NN和2NN工作机制NN和2NN工作机制详解Fsimage和Edi
java大数据最全课程学习笔记(4)-
2021-10-12

java大数据最全课程学习笔记(3)-

目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages目录HDFS 简介及操作HDFS概述HDFS产出背景及定义HDFS优缺点HDFS组成架构HDFS文件块大小(重点)HDFS的Shell操作(开发重点)基本语法命令大全常用命令实操H
java大数据最全课程学习笔记(3)-
2014-05-10

ArrayList 最细致的解析笔记

ArrayList是一个类,这个类有一个数组参数elementData,ArrayList集合中的元素正是保存在这个数组中,它继承了数组查询的高性能,参考第3篇。ArrayList还封装了很多方法,便于对数组中的数据进行操作处理,其中就包括
2023-06-02

SQL笔记:把Excel的数据导入MySQL中作运算

很多Excel用户都知道,Excel单个工作簿单张表存储的数据量很有限(旧版本月60多万条记录,新版本也才104万条不到),而且Excel中,因为自带各种格式与公式,兼之高度封装性等原因,导致Excel在计算比较大的数据量时,会出现卡顿甚至死机的现象,很是让人
SQL笔记:把Excel的数据导入MySQL中作运算
2021-01-19

编程热搜

目录