`
ludo2008
  • 浏览: 10422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

数据库设计范式说明

 
阅读更多

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

一、第一范式

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

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

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)
);
复制代码

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

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

分享到:
评论

相关推荐

    数据库设计范式.doc

    数据库范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式 的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系 数据库中的关系必须满足一定的要求,即满足不同的...

    数据库设计三大范式应用实例剖析

    数据库设计三大范式应用实例剖析

    数据库的设计和范式

    数据库范式:  第1范式:属性必须是原子的,不可分的。从实体的角度看是实体属性的类型只能是基本数据类型,不能是复合数据类型。这一条对于关系数据库来说很容易满足,但对于面向对象数据库来说不一定了。而且...

    数据库设计三大范式简析

    在实际开发中最为常见的设计范式有三个: 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 第一范式的合理遵循需要...

    数据库设计模板.docx

    数据库设计模板 *****中心开发部 文档编号 2011-6-14 版本 A1 密级 商密A 项目名称 时代集团产品跟踪平台 项目来源 时代集团 DR-RD-020(V1.1) 数据库设计说明书 (内部资料 请勿外传) 编 写: 日 期: 检 查: 日 期...

    第二章 数据库系统设计及范式分析--班级管理系统需求说明书

    一个成功的信息管理系统,是建立在许多条件之上的,而数据库是其中一个非常重要的条件和关键技术。...信息管理系统所涉及的数据库设计分五个步骤:数据库需求分析、概念设计、逻辑设计、物理设计与加载测试。

    软件数据库设计模板.docx

    数据库环境说明 描述本设计需采用的数据库系统,设计工具,编程工具以及配置等 逻辑结构设计 数据库设计人员根据需求文档,创建与数据库相关的那部分实体关系图软件数据库设计模板全文共6页,当前为第5页。...

    软件项目数据库设计报告.doc

    { 项目名称 } 数据库设计报告 "文件状态: "文件标识:"Company-Project-SD-DATABASE " "[ ] 草稿 " " " "[ ] 正式发布 " " " "[ ] 正在修改 " " " " "当前版本:"X.Y " " "作 者:" " " "完成日期:"Year-Month-Day...

    数据库范式

    数据库设计三大范式应用实例剖析. 范式说明,及其范式应用。 第一范式(1NF) 第二范式(2NF) 第三范式(3NF

    Sql Server 2008 数据库课设报告(图书管理系统)

    要求数据表设计要合理,要符合数据库设计的理论范式,对数据表设计作必要的说明并抓图。 数据表名必须与自己真实姓名有关,所有同学不能同名。 3.视图设计 要求根据系统需求作必要的视图设计,如在一次查询中涉及到...

    Mysql数据库设计三范式实例解析

    2NF:唯一性 一个表只说明一个事物; 3NF:每列都与主键有直接关系,不存在传递依赖; 第一范式(1NF) 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/informix/...

    CRM数据库设计说明.doc

    客户关系管理系统 数据库设计报告 "文件状态: "文件标识:"Company-Project-SD-DATABASE " "[ ] 草稿 " " " "[ ] 正式发布 " " " "[ ] 正在修改 " " " " "当前版本:"X.Y " " "作 者:" " " "完成日期:"Year-Month...

    超市管理数据库课程设计大作业.doc

    中――完成上述题目的大部分内容,功能基本完善,文档较详细,数据库设计基本合理, 有基本的人机接口界面。 4. 及格――基本完成上述内容,只有基本功能文档。 不及格――未按时完成上述内容,或者抄袭(雷同者...

    电商项目数据库设计文档.docx

    电商项目数据库设计文档全文共7页,当前为第1页。电商项目数据库设计文档全文共7页,当前为第1页。 电商项目数据库设计文档全文共7页,当前为第1页。 电商项目数据库设计文档全文共7页,当前为第1页。 第六小组 潮...

    酒店管理系统数据库设计.docx

    数据库设计说明 3 2.1 数据库设计原则 3 2.2 数据库ER图设计 3 2.3 数据库表设计 4 酒店管理系统数据库设计全文共7页,当前为第1页。 酒店管理系统数据库设计全文共7页,当前为第1页。 文档编写分工说明 负责人 ...

    基于QT和MYSQL的学生竞赛管理系统源码(有学生 老师 管理员三种用户的登陆+数据库设计采用三范式).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等...基于QT和MYSQL的学生竞赛管理系统源码(有学生 老师 管理员三种用户的登陆+数据库设计采用三范式).zip

    数据库设计原则.docx

    在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解): 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 第二范式:2NF是...

    花店管理系统-数据库设计.doc

    数据库设计;花店管理系统 1 概述 随着人们的物质生活水平的不断提高和社会的进步,人们表达情感的方式也大不一样 ,比如,在情人节里会送给自己心仪的人一束鲜艳欲滴的玫瑰,在三.八妇女节会送给妈 妈一束美丽的...

    系统数据库设计文档.doc

    表5.1数据库表的功能说明 "序号 "表 "功能说明 " "1 "RENSHI_USERS "用户信息数据表 " ----------------------- 系统数据库设计文档全文共4页,当前为第1页。 系统数据库设计文档全文共4页,当前为第2页。 系统...

Global site tag (gtag.js) - Google Analytics