加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

最全的Oracle-SQL笔记(8)

发布时间:2020-12-12 16:22:08 所属栏目:百科 来源:网络整理
导读:1.8、数据库设计范式数据库设计范式实际上非常的重要,但是从实际的开发来看,如果真的全部按照范式去做,则这个程序没法写,包括查询语句也会变得复杂。在Oracle中的scott用户的全部表,实际上就已经很好的体现了一张设计思路,雇员-部门的关系。1) 第一范

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,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),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,78,'王五',23,80,赵六',22,90,0.3);从以上的数据库脚本上可以发现,所有的课程信息冗余了,而且还存在以下问题:|-如果一门课程没有一个学生选择,则此而成就从学校彻底消失了|-课程中本身也应该包含一个课程的编号,但是如果按照以上的设计,则课程编号肯定重复|-如果要更改课程信息,则要更改许多条记录我们使用第二范式修改数据库脚本:|-学生是一个实体--学生表create table student(stuno varchar2(50) primary key not null,stuage number);|-课程也应该是一个实体--课程表create table course(cid number(5) primary key not null,credit number);|-学生选课信息也是一个实体--学生选课表create table selectcourse(stuno varchar2(50),cid number(5),加入外键关联,因为学生没了,成绩就没了,因为课程没了,成绩就没了);以上设计解决了以下问题:|-学生不选课的时候,课程信息不会消失|-更新课程的时候直接更新课程表即可|-所有的关联关系在关系表中体现。3) 第三范式在实际开发中,第三范式的使用是最多的。例如,现在要求设计一张学生表,包含学号、姓名、年龄、所在院校、学院地址、学院电话,此时肯定不能使用第一范式,但是现在如果使用的是第二范式呢?create table student(stuno varchar2(50) primary key not null,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,ctel varchar2(200) not null);create table student(stuno varchar2(50) primary key not null,建立主-外键关系);该设计是一个很明确的一对多的关系设计。数据库的唯一原则:|-数据库表的关联查询越少越好,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读