`
changhongbao
  • 浏览: 123110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle笔记(十六) 数据库设计范式

 
阅读更多

Oracle笔记(十六) 数据库设计范式

数据库设计范式是一个很重要的概念,但是这个重要程度只适合于参考。使用数据库设计范式,可以让数据表更好的进行数据的保存,因为再合理的设计,如果数据量一大也肯定会存在性能上的问题。所以在开发之中,唯一可以称为设计的宝典 —— 设计的时候尽量避免日后的程序出现多表关联查询。

一、第一范式

所谓的第一范式指的就是数据表中的数据列不可再分。

例如,现在有如下一张数据表:

CREATE TABLE member (
  mid NUMBER PRIMARY KEY,
  name VARCHAR2(200) NOT NULL,
  contact VARCHAR2(200)
);

这个时候设计的就不合理,因为联系方式由多种数据所组成:电话、地址、email、手机,邮政编码,所以这种设计是不符合的,现在可以修改设计:

复制代码
CREATE TABLE member (
  mid NUMBER PRIMARY KEY,
  name VARCHAR2(200) NOT NULL,
  address VARCHAR2(200),
  zipcode VARCHAR2(6),
  mobile VARCHAR2(20),
  tel VARCHAR2(20)
);
复制代码

但是在这里面有两点需要说明:

  • 第一点,关于姓名,在国外的表设计中,姓名也分为姓和名两类,但是在中国就是姓名保存;
  • 第二点,关于生日,生日有专门的数据类型(DATE),所以不能将其设置为生日年,生日月,生日日;

所谓不可分割指的是所有的数据类型都使用数据库提供好的各个数据类型。

二、第二范式:多对多

第二范式:数据表中的非关键字段存在对任一候选关键字段的部分函数依赖;

第二范式分为两种方式理解:

  • 理解一:列之间不应该存在函数关系,现在有如下一个设计:
CREATE TABLE orders (
  oid NUMBER PRIMARY KEY,
  amount NUMBER,
  price NUMBER,
  allprice NUMBER
);

现在的商品总价(allprice)=商品单价(price)*商品数量(amount),所以存在了函数的依赖关系;

  • 理解二:通过一个数据表的设计体现一下,完成一个学生选课系统,如果说现在按照第一范式,则如下:
复制代码
CREATE TABLE studentcourse (
  stuid NUMBER PRIMARY KEY,
  stuname VARCHAR2(20) NOT NULL,
  cname VARCHAR2(50) NOT NULL,
  credit NUMBER NOT NULL,
  score NUMBER
);
INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (1,'张三','Java',3,89);
INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (2,'李四','Java',3,99);
INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (3,'王五','Java',3,78);
INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (1,'张三','Oracle',1,79);
INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (2,'李四','Oracle',1,89);
复制代码

这种设计符合于第一设计范式,但是不符合于第二范式,因为程序会存在如下的错误:

  • 数据重复:学生和课程的数据都处于重复的状态,而且最为严重的是主键的设置问题;
  • 数据更新过多:如果说现在一门课程已经有了3000人参加的话,则更改一门课程学分的时候需要修改3000条记录,肯定性能上会有影响;
  • 如果一门课程没有一个学生参加,这门课程就从学校彻底消失了;

如果要想解决此问题,则可以将数据表的设计修改如下:

复制代码
CREATE TABLE student (
  stuid NUMBER PRIMARY KEY,
  stuname VARCHAR2(20) NOT NULL
);
CREATE TABLE course (
  cid NUMBER PRIMARY KEY,
  cname VARCHAR2(50) NOT NULL,
  credit NUMBER NOT NULL
);
CREATE TABLE studentcourse (
  stuid NUMBER REFERENCES student(stuid),
  cid NUMBER REFERENCES course(cid),
  score NUMBER
);
INSERT INTO student (stuid,stuname) VALUES (1,'张三');
INSERT INTO student (stuid,stuname) VALUES (2,'李四');
INSERT INTO student (stuid,stuname) VALUES (3,'王五');
INSERT INTO course (cid,cname,credit) VALUES (10,'Java',3);
INSERT INTO course (cid,cname,credit) VALUES (11,'Oracle',1);
INSERT INTO course (cid,cname,credit) VALUES (12,'Linux',2);
INSERT INTO studentcourse (stuid,cid,score) VALUES (1,10,89);
INSERT INTO studentcourse (stuid,cid,score) VALUES (2,10,99);
INSERT INTO studentcourse (stuid,cid,score) VALUES (3,10,78);
INSERT INTO studentcourse (stuid,cid,score) VALUES (1,11,79);
INSERT INTO studentcourse (stuid,cid,score) VALUES (2,11,89);
复制代码

这种设计与之前讲解运动会-项目-成绩的设计是一样的。

三、第三范式:一对多

例如,现在一个学校有多个学生,如果用第一范式无法实现,而如果用第二范式则表示多对多的关系,即:一个学校有多个学生,一个学生在多个学校,不符合于要求,所以此时可以使用第三范式,参考之前的部门和雇员操作实现,一个部门有多个雇员,所以按照设计编写如下:

复制代码
CREATE TABLE school (
  sid NUMBER PRIMARY KEY,
  sname VARCHAR2(20) NOT NULL
);
CREATE TABLE student (
  stuid NUMBER PRIMARY KEY,
  stuname VARCHAR2(20) NOT NULL,
  sid NUMBER REFERENCES school(sid)
);
复制代码

而在实际的工作之中,第三范式的使用是最多的。

以上的三个范式只是作为参考使用。

分享到:
评论

相关推荐

    Oracle学习笔记(数据库设计范式 PowerDesigner工具)

    Oracle学习笔记(数据库设计范式 PowerDesigner工具),有具体的代码案例

    达内,tarena,oracle笔记,oraclePPT课件,达内oracle笔记

    Oracle是世界上最广泛使用的商业关系型数据库管理系统之一,...通过达内的Oracle笔记和PPT课件,学员可以系统地学习Oracle数据库的各个方面,从基础知识到高级应用,为成为专业的数据库管理员或开发人员奠定坚实基础。

    Oracle数据库笔记-JackChiang.docx

    Jack Chiang的Oracle数据库笔记主要涵盖了Oracle数据库的基础知识、管理操作、性能优化以及一些常见问题的解决方案。以下是对这些知识点的详细阐述: 1. **Oracle数据库基础**:Oracle数据库采用SQL(结构化查询...

    Oracle数据库笔记共23页.pdf.zip

    在数据库设计方面,Oracle支持规范化理论,通过范式化降低数据冗余,提高数据质量。同时,Oracle提供了物化视图、分区表等技术,以满足复杂的数据分析需求。 最后,Oracle数据库的管理和监控工具,如企业管理器(EM...

    oracle 数据库操作处理笔记

    这份“Oracle数据库操作处理笔记”全面介绍了Oracle数据库的各个方面,无论是初学者还是经验丰富的DBA,都能从中受益,提升对Oracle数据库的理解和操作技能。通过深入学习和实践,你可以更有效地管理和维护Oracle...

    数据库系统原理学习笔记

    6. **数据库范式**:范式是数据库规范化的过程,主要包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)和第四范式(4NF)。遵循这些范式可以减少数据冗余,提高数据的一致性和完整性。...

    李兴华Oracle笔记整理

    李兴华Oracle笔记整理是Oracle核心基础知识的总结,涵盖了Oracle的安装、SQLPlus基本命令、scott用户的表结构、增删改查、分页处理、事务处理、DDL、三范式、用户权限管理、数据的备份与恢复、PL/SQL等知识点。...

    2011MLDN李兴华Oracle课堂笔记PDF档

    这部分内容更为深入,涵盖了数据库设计的高级主题,如视图的创建和使用,提高查询性能的索引,数据的安全备份策略,数据库对象的同义词,以及关系数据库设计的范式理论。此外,可能还会涉及数据库设计工具的使用和...

    李兴华—oracle课堂笔记(全).rar

    笔记可能会涉及范式理论,如何进行规范化设计,以及反规范化在特定情况下的应用。 5. **性能优化**:Oracle提供了丰富的性能优化工具和策略,如SQL调优、索引优化、表分区、绑定变量、DBMS_XPlan等。笔记会讲解如何...

    mldn的李兴华oracle笔记

    8. **数据库设计与架构**:讲解如何进行数据库设计,包括范式理论、ER模型和物理设计,以及数据库架构的优化。 9. **Oracle的新特性**:可能包含Oracle新版本引入的特性,如In-Memory、Automatic Memory Management...

    Oracle笔记和总结,包含了ORACLE实际开发中大量列子

    在数据库设计方面,正常的规范化理论(如第一范式、第二范式、第三范式等)是理解关系数据库设计的关键。此外,Oracle还提供了分区技术,以优化大数据量表的查询性能。 Oracle的备份与恢复机制是另一个重要主题。...

    三天学习 oracle笔记

    12. **数据库设计**:理解数据库设计的基本原则,如范式理论,可以帮助你构建高效且易于维护的数据库模式。 "Oracle集锦.txt"中可能涵盖了以上这些主题,并且可能还包括了实例演示、常见问题解答和学习资源推荐。...

    Oracle 超强学习笔记

    了解第三范式、实体关系模型和数据库设计原则能帮助创建稳定且可扩展的数据库架构。 10. **高可用性与集群** Oracle Real Application Clusters (RAC) 提供了数据库的高可用性,允许多个实例共享同一物理数据库,...

    数据库复习笔记及mooc上的题库

    了解ER(实体-关系)模型和范式理论(如第一范式、第二范式和第三范式)是设计高效数据库的关键。 数据库设计包括需求分析、概念设计、逻辑设计和物理设计四个阶段。在需求分析阶段,要明确数据库需要存储哪些数据...

    Oracle 笔记.docx

    - **数据库设计与三大范式**:确保数据库结构合理,减少数据冗余和提高数据完整性。 - **备份与恢复**:确保数据安全性和业务连续性。 #### 五、JDBC - **JDBC简介**:Java Database Connectivity,Java语言访问...

    oracle笔记

    这篇“Oracle笔记”涵盖了多个Oracle数据库的重要概念和技术,旨在帮助读者深入理解和掌握Oracle的相关知识。 1. **Oracle数据库架构** Oracle数据库采用多层架构,包括用户接口层、应用服务器层和数据库服务器层...

    oracle学习笔记

    Oracle学习笔记是一个专门为初学者设计的教程集合,涵盖了Oracle数据库的基础到高级概念。这个资源包含官方的学习材料,确保了信息的准确性和权威性。Oracle数据库是全球广泛使用的数据库管理系统之一,尤其在企业级...

Global site tag (gtag.js) - Google Analytics