关系数据库——范式/反范式的利弊权衡和建议

范式(避免数据冗余和操作异常)

函数依赖

A->B  A和B是两个属性集,来自同一关系模式,对于同样的A属性值,B属性值也相同

平凡的函数依赖

X->Y,如果Y是X的子集

非平凡的函数依赖

X->Y,如果Y不是X的子集

部分函数依赖

X->Y,如果存在W->Y,且W⊂X

传递函数依赖

R(U)中,如果X→Y(非平凡函数依赖,完全函数依赖)Y→Z 则称ZX传递函数依赖。

    记为:X Z

super key&candidate key&primary key&主属性&非主属性

super key:在关系中能唯一标识元素的属性集

candidate key或key:不含有多余属性的super key

primary key:在candidate key 中任选一个

candidate key中X决定所有属性的函数依赖是完全函数依赖

包含在任何一个candidate key中的属性 ,称为主属性

不包含在candidate key中的属性称为非主属性

1NF 列不可分

列不可分

2NF 消除了非主属性对键的部分函数依赖

在关系T上有函数依赖集F,F+是F的闭包。

F满足2NF,当且仅当 每个非平凡的函数依赖X->A(F+),A是单个非主属性,要求X不是任何key的真子集(有可能是super key,也有可能是非key)。

3NF 消除了非主属性对键的传递函数依赖

F满足3NF,当且仅当 每个非平凡的函数依赖X->A(F+),A是单个非主属性,要求X是T的super key

BCNF 消除了主属性对键的部分函数依赖和传递函数依赖

F满足BCNF,当且仅当 每个非平凡的函数依赖X->A(F+),A是单个属性,要求X是T的super key

对于F+中 的任意一个X->A,如果A是单个属性,且A不在X中,那么X一定是T的super key。

 

反范式(减少连接,提高查询效率)

没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整的。

Pattern1:合并1对1关系

car_id

car_name

1

c1

2

c2

3

c3

teacher

teacher_id

teacher_name

1

t1

2

t2

3

t3

4

t4

合并后

car_and_teacher

car_id

car_name

teacher_id

teacher_name

1

c1

1

t1

2

c2

2

t2

3

c3

3

t3

NULL

NULL

4

t4

问题:会产生大量空值,若两边都部分参与则不能合并;

部分参与为大部分参与时比较适合Pattern1

Pattern2:1对N关系中复制非键属性以减少连接

两表连接时复制非键属性以减少连接

例:查询学生以及所在学院名,可以在学生表中不仅存储学院id,并且存储学院名

faculty

fid

fname

1

f1

student

sid

sname

fid

fname

1

s1

1

f1

维护时:

1)如果在UI中,只允许用户进行选择,不能自行输入,保证输入一致性

2)如果是程序员,对于类似学院名这种一般不变的代码表,在修改时直接对两张表都进行修改;如果经常变化,则可以加一个触发器。

Pattern3:1对N关系中复制外键以减少连接

把另一张表的主键复制变成外键

应用后:

Pattern4:N对N关系中复制属性,把两张表中经常需要的内容复制到中间关系表中以减少连接

Pattern5:引入重复值

通常对于一个多值属性,值不太多,且不会经常变,可以在表中建立多个有关此属性的列

address1 | address2 | address3 | address4

Pattern6:建立提取表

为了解决查询和更新之间不可调和的矛盾,可以将更新和查询放在两张表中,从工作表中提取查询表,专门用于查询。只适用于查询实时性不高的情况。

Pattern7:分表

水平拆分

垂直拆分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch学习入门 (二) Variable(变量)

Variable(变量) autograd.Variable 是包的核心类. 它包装了张量, 并且支持几乎所有的操作. 一旦你完成了你的计算, 你就可以调用 .backward() 方法, 然后所有的梯度计算会自动进行. 你还可以通过 .data 属性来访问原始的张量, 而关于该 variable&#…

Linux(x)-

Ubuntu装机后的基础应用

pytorch入门学习(三) 神经网络

神经网络可以使用 torch.nn 包构建. autograd 实现了反向传播功能, 但是直接用来写深度学习的代码在很多情况下还是稍显复杂,torch.nn 是专门为神经网络设计的模块化接口. nn 构建于 Autograd 之上, 可用来定义和运行神经网络. nn.Module 是 nn 中最重要的类, 可把它看成是一个…

leetcode1033. 移动石子直到连续

三枚石子放置在数轴上&#xff0c;位置分别为 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子&#xff0c;并将该石子移动到某一整数位置 k 处&#xff0c;其中 x &…

pytorch学习 训练一个分类器(五)

训练一个分类器 就是这个, 你已经看到了如何定义神经网络, 计算损失并更新网络的权重. 现在你可能会想, 数据呢? 一般来说, 当你不得不处理图像, 文本, 音频或者视频数据时, 你可以使用标准的 Python 包将数据加载到一个 numpy 数组中. 然后你可以将这个数组转换成一个 to…

Git(6)-Git配置文件、底层操作命令

Git基本命令1. 常用(迷糊)命令-冷知识2. git 配置2.1 设置 配置文件2.2 查看 配置文件--git config -l2.3 移除 配置文件设置--unset2.3 命令别名 --alias3.git 对象 &#xff08;git底层操作命令&#xff09;3.1 初始化一个版本库3.2 新建一个简单的blob 对象3.3 基于散列值查…

【软考中级】网络工程师:8.网络安全

本章考察内容比较广泛&#xff0c;考题对知识点都会有所涉及。 8.1 网络安全的基本概念 8.1.1 网络安全威胁的类型 窃听 这种情况发生在广播式网络系统中&#xff0c;每个节点都可以读取数据&#xff0c;实现搭线窃听、安装通信监视器和读取网上的信息等。 假冒 当一个实体…

leetcode9 回文数

判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个…

caffe各层参数详解

在prototxt文件中,层都是用layer{}的结构表示,而里面包含的层的参数可以在caffe.proto文件中找到,比如说Data类型的结构由message DataParameter所定义,Convolution类型的结构由message ConvolutionParameter所定义。 具体说明下: name表示该层的名称type表示该层的类型,…

caffe网络结构图绘制

绘制网络图通常有两种方法&#xff1a; 一种是利用python自带的draw_net.py&#xff0c;首先安装两个库&#xff1a; sudo apt-get install graphviz sudo pip install pydot 接下来就可以用python自带的draw_net.py文件来绘制网络图了。 draw_net.py执行时带三个参数&…

Git(7)-Git commit

Git提交1.识别不同的提交1.1绝对提交名-ID1.2 引用和符号引用--HEAD2.查看提交的历史记录-git log3.提交图-gitk4.提交的范围4.1 X..Y4.1 X...Y5.查找bad 提交--git bisect6.查看代码修改者-git blame命令概览git commit -a # 直接提交修改和删除文件有效加了-a&#xff0c;在 …

leetcode111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 思路&#xff1a…

Caffe将图像数据转换成leveldb/lmdb

Caffe中convert_imageset projrct将图像数据转换成Caffe能读取的数据格式leveldb/lmdb -gray=true //whether read gray image -shuffle=true //whether mix order -resize_height=28 -resize_width=28 -backend=lmdb …

leetcode155. 最小栈

设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。 top() -- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 示例: MinStack minStack new MinStack()…

理解Caffe的网络模型

目录 1. 初见LeNet原始模型2. Caffe LeNet的网络结构3. 逐层理解Caffe LeNet 3.1 Data Layer3.2 Conv1 Layer3.3 Pool1 Layer3.4 Conv2 Layer3.5 Pool2 Layer3.6 Ip1 Layer3.7 Relu1 Layer3.8 Ip2 Layer3.9 Loss Layer 1. 初见LeNet原始模型 Fig.1. Architecture of original …

Git(8)-分支

分支1. 分支名2. 创建分支-git branch3. 查看分支-git show-branch4. 检出分支4.1 有未提交的修改时进行检出4.2 合并变更到不同的分支git checkout -m5. 分离HEAD 分支6.删除分支分支操作命令概览 git branch # 列出版本库中的分支 git branch -r # 列出远程跟踪分支…

caffe开始训练自己的模型(转载并验证过)

学习caffe中踩了不少坑&#xff0c;这里我参考了此博主的文章&#xff0c;并体会到了如何训练自己的模型&#xff1a;http://www.cnblogs.com/denny402/p/5083300.html 学习caffe的目的&#xff0c;不是简单的做几个练习&#xff0c;最终还是要用到自己的实际项目或科研中。因…

leetcode169. 多数元素

给定一个大小为 n 的数组&#xff0c;找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2 思路&…

Git(9)-diff

分支1. diff in Linux/Unix2. diff in Git3. git diff 两点语法Linux/Unix 系统中存在diff 命令&#xff0c;可以用来显示两个文本/工作路径的差异。Git diff 在此基础上进行的扩展。 1. diff in Linux/Unix Linux 系统中的diff 命令&#xff1a;提供了一个文件如何转化为另一…

图像拼接(一):柱面投影+模板匹配+渐入渐出融合

这种拼接方法的假设前提是&#xff1a;待拼接的两幅图像之间的变换模型是平移模型&#xff0c;即两幅图像同名点位置之间只相差两个未知量&#xff1a;ΔxΔx 和ΔyΔy&#xff0c;自由度为2&#xff0c;模型收得最紧。所以只有所有图像都是用同一水平线或者同一已知倾斜角的摄…