数据库设计范式是一个很重要的概念,但是这个重要程度只适合于参考。使用数据库设计范式,可以让数据表更好的进行数据的保存,因为再合理的设计,如果数据量一大也肯定会存在性能上的问题。所以在开发之中,唯一可以称为设计的宝典 —— 设计的时候尽量避免日后的程序出现多表关联查询。
一、第一范式
所谓的第一范式指的就是数据表中的数据列不可再分。
例如,现在有如下一张数据表:
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)
);
而在实际的工作之中,第三范式的使用是最多的。
以上的三个范式只是作为参考使用。
相关推荐
数据库设计通常会参考一些标准和最佳实践,如ER模型、范式理论、SQL语言规范等,这些参考资料应在设计说明书中列出,供读者查阅。 ### 2. 外部设计 外部设计关注的是数据库与用户、应用程序的交互方式。这部分主要...
此外,文档还指出了数据库设计过程的复杂性,它需要经过反复的探寻和逐步求精,最终形成一个能够满足用户需求且具有良好性能和较高范式的数据模型。 文档中提到的BroCMS是一个内容管理系统,它应用了bro框架,使用...
数据库系统范式是关系数据库设计的基础,旨在解决数据冗余、更新异常、插入异常、删除异常等问题。通过关系模式的规范化,我们可以消除不合适的数据依赖,提高数据的一致性和完整性。 数据库系统原理 1.1 数据库...
数据库设计的三大范式——第一范式(1NF)、第二范式(2NF)和第三范式(3NF)——是确保数据结构合理化、减少数据冗余和避免操作异常的关键概念。这些范式主要应用于关系数据库设计,帮助构建高效且稳定的数据库...
Oracle模板系统数据库设计说明书是针对使用Oracle数据库进行系统模板化设计的一份详细指南。这份文档对于深入了解Oracle数据库的架构、优化以及如何构建高效、可扩展的数据库系统具有极高的参考价值。以下是根据标题...
数据库设计文档主要包括数据库环境说明、数据库的命名规则、逻辑设计、数据库的实施等几个部分。 数据库环境说明中,数据库采用 Micrsoft SQL Server 数据库管理系统建立并维护。数据库设计过程中采用Micrsoft 公司...
数据库三范式是关系数据库设计的基本原则,目的是为了消除数据冗余、提高数据的一致性和完整性。下面是对数据库三范式的详细解释: 第一范式(1NF) 第一范式的要求是:字段不可分。也就是说,一个字段不能再被...
《数据库设计说明书》 在信息技术领域,数据库设计是构建高效、稳定、可扩展的信息系统的基础。这份《数据库设计说明书》详细阐述了如何进行规范化的数据库设计过程,旨在为系统开发提供明确的指导和依据。 一、...
数据库范式是关系数据库设计中的一种规范约束规则,用于确保数据库的逻辑一致性和数据的完整性。下面是对数据库范式的理解和例题: 1. 属性的分类: 在关系数据库中,属性可以分为主属性和非主属性。主属性是包含...
《软件项目模板-数据库设计说明书》是一个非常重要的文档,它为软件开发中的数据库设计提供了详细的指导和规范。数据库设计是信息系统开发的关键环节,它决定了数据的存储、组织和访问方式,直接影响到系统的性能、...
星型数据库设计说明文档 星型数据库设计是数据仓库开发中最重要的步骤之一。在这个过程中,我们需要了解如何将标准的在线事务处理系统(OLTP)转移到最终的星型数据库系统(也叫OLAP系统)。在这个过程中,我们需要...
### 网上商城项目数据库设计相关知识点...以上内容概述了网上商城项目的数据库设计相关知识点,涵盖了从实体关系设计、范式规范、索引优化到数据完整性的各个方面。这有助于构建一个高效、可靠且易于维护的数据库系统。
"第二章 数据库系统设计及范式分析--班级管理系统需求说明书"涵盖了数据库设计的关键阶段和理论,让我们一起深入探讨其中的知识点。 首先,数据库需求分析是整个过程的起点。在这个阶段,我们需要明确班级管理系统...
### 数据库设计一般步骤详解 #### 一、引言 数据库设计是一门涉及计算机科学、信息管理和业务逻辑的交叉学科,旨在为特定的应用环境构建高效、稳定的数据存储和管理系统。良好的数据库设计不仅能确保数据的准确性与...
数据库设计说明书是软件开发过程中的重要文档,它详细记录了数据库的结构、关系以及操作规则,为系统的数据存储和管理提供了规范。本说明书主要针对"商厦人事劳资管理系统",旨在提高人事和薪资管理的效率与准确性。...
数据库的设计文档,通常被称为数据库设计说明书,是信息系统开发过程中至关重要的一环。它详细记录了数据库的结构、逻辑和物理设计,以及与业务需求的对应关系,确保数据的有效管理和高效使用。下面将对这个主题进行...
在数据库设计过程中,遵循了规范化原则,采用第三范式(3NF)来消除冗余,确保数据的完整性和一致性。设计原则还包括将不同主题的字段分配到不同的表,将信息分解为小逻辑单元,避免推导和计算字段,以及确保收集...