文档章节

数据库设计

C
 Claroja
发布于 2017/05/08 23:22
字数 1430
阅读 7
收藏 0
点赞 0
评论 0

1.相关概念

(1)实体(entity):我们用数据库要描述的对象,可以是具体的,也可以是抽象的。比如“一个学生”、“一本书”、“一门课”等等;当然也可以是“学生与老师的关系”。

(2)字段(fields):就是我们看到的列(column),代表了我们要描述实体的属性。

(3)记录(record):就是我们平常所说的行(row),代表了我们要描述不同的具体实体。

(4)码(key):表中可以唯一确定一个元组的某个属性(或者属性组),我们在数据表中叫做键。

(5)主键(primary key):用于唯一标识一个表中的一条记录的键。

(6)外键(foreign keys):对连接父表和子表的相关记录的主键字段的复制。

(7)完全函数依赖(full functional dependency):次属性完全依赖一个主属性,或者一个主属性组

(8)部分函数依赖(partial functional dependency):次属性依赖于主属性组中的某一个属性

(9)依赖表(dependent table):也称为弱实体(weak entity)是需要用父表标识的子表。

(10)关联表(associative table):是多对多关系中两个父表的子表。

2.数据设计参考范式

2.1第一范式(1NF):属性不可拆分



         图2.1.1“邮箱”属性的值被分为两列,不符合第一范式。而图2.2.2“邮箱”的属性被分割,也不符合第一范式。更改后的图2.1.3则符合了第一范式,属性不可拆分。

 

2.2第二范式(2NF):去除部分依赖,保留完全依赖

姓名

课程

分数

教材

价格

小王

英语

91

英语书

10

小魏

数学

85

数学书

9

小王

数学

96

数学书

9

小魏

语文

100

语文书

8

图2.2.1:符合第一范式,但不符合第二范式


         现在我们有一张符合第一范式的表,但他仍然会给我们带来很多麻烦。

         如果想要增加一门课程,如何操作?

 

姓名

课程

分数

教材

价格

小王

英语

91

英语书

10

小魏

数学

85

数学书

9

小王

数学

96

数学书

9

小魏

语文

100

语文书

8

 

物理

 

物理书

 

 

物理

 

物理书

 

 

物理

 

物理书

 

图2.2.2:插入异常

        

         每次插入“物理”都要插入一次“物理书”。而且,主要的“姓名”字段为空,这个叫插入异常。

 

姓名

课程

分数

教材

价格

小王

英语

91

英语书

10

小魏

数学

85

数学书

9

小王

数学

96

数学书

9

图2.2.3:删除异常

        

         由于高年级不再需要“语文课”,那么我们先把含有“语文”的记录都删除掉,这个时候我们同样把“课程”和“教材”关系也删除了,我们就不知道“语文”这门课要用什么“教材”了。这个叫删除异常。

 

姓名

课程

分数

教材

价格

小王

英语

91

英语书

10

小魏

数学

85

数学书

9

小王

数学

96

数学书

9

小魏

语文

100

语文书

8

图2.2.4:更改异常

        

         我们要把“数学书”这个教材换成“高级数学书”,那么所有的先关记录都要更改一遍,是不是很麻烦?这个叫更改异常。

         为了解决上述三个问题,我们就引入了第二范式(2NF)

         (姓名,课程)>>(分数)

         (姓名,课程)>>(教材)

         由于“姓名”和“课程”这两个字段能确定剩下的字段,我们就称这样的字段组合为“码”,而码中的每个字段我们称之为“主属性”。非码的字段我们称之为“次属性”。

         我们注意到,在(姓名,课程)>>(教材)的这个关系中,存在(课程)>>(教材)。就是课程可以单独确定教材,那么“老师”这个字段,对“姓名”和“课程”键的依赖就叫做部分依赖(因为它部分依赖与组合键中的“课程”字段)。而“教室”、“时间”则完全依赖于“姓名”和“课程”的组合键。

通过拆分表,我们消除“部分依赖”。



上述三个问题是不是都解决了?在以后的学习中我们会学习到如何把两个表关联起来。

 

2.3第三范式(3NF):符合2NF,并且消除“传递依赖”



         每学期学校都会购书,而每年的书的价格都不一样,比如今年“数学书”涨价卖“11”块,我们就要把所有的含有数学书的记录的价格都更改一遍,还是存在异常?

         在这里,“课程”>>“教材”>>“价格”,那么“价格”对“课程”就是“传递依赖”。这个时候我们需要把“课程”表再次拆分,消除“传递依赖”。



         最终我们得到了满足三个范式的表格。即图2.3.1(拆分1)、图2.3.3(拆分3)、图2.3.4(拆分4)所组成的表格。



         对比一下我们最初的表,是否很整洁呢?


3.结束语

         数据库设计的三个范式是我们在设计数据库时可以参考的规则,但并不是我们必须要做的规范。所有的技术都要服务于我们的具体业务,而不应该为了好的技术而技术。

         同样做数据库也是如此,比如如我我们是为了维护网站,或者做销售系统,主要是为了储存信息,即On-Line Transaction Processing联机事务处理过程(OLTP),三个范式则给我们提供了比较好的参考依据;但是我们如果只是为了做数据分析,即Online Analytical Processing联机分析处理过程(OLAP),则完全可以抛弃三个范式。



© 著作权归作者所有

共有 人打赏支持
C
粉丝 0
博文 128
码字总数 44892
作品 0
南京
由代码生成数据库结构,保障设计正常传递到实现

我们常常使用代码生成工具来生成表结构。为什么不试试从代码来生成数据库表结构呢? 这个观点有些匪夷所思,但是熟悉Hibernate的同志应该有所体会。Hibernate有一个功能,叫做hbm2ddl,在系统...

土豆饼 ⋅ 2016/06/16 ⋅ 14

软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)

摘要: 数据库是系统的根基,如果需求变更导致你要经常修改数据库的字段,甚至需要修改表及表关系,相信多折腾几次谁都受不了!因为数据库结构的变化,不仅仅是数据库本身的变更,实体类、数...

fireball1975 ⋅ 2014/02/25 ⋅ 0

数据仓库和数据库的区别(一)

数据库是面向事务的设计,数据仓库是面向主题设计的。数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。 数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设...

张欢19933 ⋅ 2016/08/21 ⋅ 0

数据库建模插件--Clay Database Modeling

Eclipse开发环境插件:数据库设计工具。具有图形用户界面的数据模型设计工具(非开源)。还可以通过对已经存在的数据库方向工程创建数据模型。此外,还可以为你的数据库产生SQL代码(DDL) ...

匿名 ⋅ 2009/04/15 ⋅ 1

Clay Database Modeling的网友评论

Eclipse开发环境插件:数据库设计工具。具有图形用户界面的数据模型设计工具(非开源)。还可以通过对已经存在的数据库方向工程创建数据模型。此外,还可以为你的数据库产生SQL代码(DDL) ...

JavaGG ⋅ 2009/12/11 ⋅ 1

SQL Server 数据库设计

一、数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置。如果不经过数据库的设...

ibm_hoojo ⋅ 2011/07/15 ⋅ 0

前辈哈 , 能否介绍下 oschina的表结构,还有如何设计的,还有最初设计时候需要注意什么吗?

前辈哈 , 能否介绍下 oschina的表结构,还有如何设计的,还有最初设计时候需要注意什么吗? 之后的数据库扩展有没有遇到问题啊,怎么才能有一个好的数据库表设计?整体的数据库架构额 我也想...

你是错的我恒对 ⋅ 2013/12/18 ⋅ 7

阿里京东去哪儿网数据库架构设计图到手!

  【IT168 资讯】随着IT架构的不断演进,云计算必定会成为未来所有IT应用的基石。作为公司数据存取的重要平台,数据库架构设计一直是众多架构师的痛点。随着众多数据库组件的诞生,这件事就...

it168网站 ⋅ 2017/10/23 ⋅ 0

hibernate的性能优化

Hibernate是对JDBC的轻量级封装,因此在很多情况下Hibernate的性能比直接使用JDBC存取数据库要低。然而,通过正确的方法和策略,在使用Hibernate的时候还是可以非常接近直接使用JDBC时的效率...

Sephiroth ⋅ 2010/03/25 ⋅ 1

AgileEAS.NET平台开发实例-药店系统-数据库设计

开篇 上篇,我们分析了,功能需求和非功能性的需求,本篇我们就来看下,如何设计数据库,当然数据库的设计也是有一些技巧性而已,不过大家经常做数据库设计的朋友都 知道,如果我们的数据库设...

何戈洲 ⋅ 2011/05/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部