转换成3NF的保持函数依赖的分解算法:

ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是关系模式R<U,F>的一个分解,U={A1,A2,...,An},F={FD1,FD2,...,FDp},并设F是一个最小依赖集,记FDi为Xi→Alj,其步骤如下:

① 对R<U,F>的函数依赖集F进行极小化处理(处理后的结果仍记为F);

② 找出不在F中出现的属性,将这样的属性构成一个关系模式。把这些属性从U中去掉,剩余的属性仍记为U;

③ 若有X→A€ F,且XA=U,则ρ={R},算法终止;

④ 否则,对F按具有相同左部的原则分组(假定分为k组),每一组函数依赖Fi所涉及的全部属性形成一个属性集Ui。若Ui¢ Uj(i≠j),就去掉Ui。由于经过了步骤②,故,于是构成的一个保持函数依赖的分解。并且,每个Ri(Ui,Fi)均属于3NF且保持函数依赖。

对于步骤1中函数集的极小化处理可以参见博客 http://i.cnblogs.com/PostDone.aspx?postid=4445027&actiontip

例1:关系模式R<U,F>,其中U={C,T,H,I,S,G},F={CS→G,C→T,TH→I,HI→C,HS→I},将其分解成3NF并保持函数依赖。

(一)计算F的最小函数依赖集

① 利用分解规则,将所有的函数依赖变成右边都是单个属性的函数依赖。由于F的所有函数依赖的右边都是单个属性,故不用分解。

② 去掉F中多余的函数依赖

A.设CS→G为冗余的函数依赖,则去掉CS→G,得:

F1={C→T,TH→I,HI→C,HS→I}

计算(CS)F1+:

设X(0)=CS

计算X(1):扫描F1中各个函数依赖,找到左部为CS或CS子集的函数依赖,找到一个C→T函数依赖。故有X(1)=X(0)∪T=CST。

计算X(2):扫描F1中的各个函数依赖,找到左部为CST或CST子集的函数依赖,没有找到任何函数依赖。故有X(2)=X(1)。算法终止。

(CS)F1+= CST不包含G,故CS→G不是冗余的函数依赖,不能从F1中去掉。

B.设C→T为冗余的函数依赖,则去掉C→T,得:

F2={CS→G,TH→I,HI→C,HS→I}

计算(C)F2+:

设X(0)=C

计算X(1):扫描F2中的各个函数依赖,没有找到左部为C的函数依赖。故有X(1)=X(0)。算法终止。故C→T不是冗余的函数依赖,不能从F2中去掉。

C.设TH→I为冗余的函数依赖,则去掉TH→I,得:

F3={CS→G,C→T,HI→C,HS→I}

计算(TH)F3+:

设X(0)=TH

计算X(1):扫描F3中的各个函数依赖,没有找到左部为TH或TH子集的函数依赖。故有X(1)=X(0)。算法终止。故TH→I不是冗余的函数依赖,不能从F3中去掉。

D.设HI→C为冗余的函数依赖,则去掉HI→C,得:

F4={CS→G,C→T,TH→I,HS→I}

计算(HI)F4+:

设X(0)=HI

计算X(1):扫描F4中的各个函数依赖,没有找到左部为HI或HI子集的函数依赖。故有X(1)=X(0)。算法终止。故HI→C不是冗余的函数依赖,不能从F4中去掉。

E.设HS→I为冗余的函数依赖,则去掉HS→I,得:

F5={CS→G,C→T,TH→I,HI→C}

计算(HS)F5+:

设X(0)=HS

计算X(1):扫描F5中的各个函数依赖,没有找到左部为HS或HS子集的函数依赖。故有X(1)=X(0)。算法终止。故HS→I不是冗余的函数依赖,不能从F5中去掉。即:F5={CS→G,C→T,TH→I,HI→C,HS→I}

③ 去掉F5中各函数依赖左边多余的属性(只检查左部不是单个属性的函数依赖)

没有发现左边有多余属性的函数依赖。故最小函数依赖集为:

F={CS→G,C→T,TH→I,HI→C,HS→I}

(二)由于R中的所有属性均在F中都出现,所以转下一步。

(三)对F按具有相同左部的原则分为:R1=CSG,R2=CT,R3=THI,R4=HIC,R5=HSI。所以ρ={R1(CSG),R2(CT),R3(THI),R4(HIC),R5(HSI)}。

声名:本文转载自百度文库

http://wenku.baidu.com/link?url=MUYZ--karIERpPnbvYAa5mb5f6LGCTtR41OFmv8lEMCivO96FmQ-ZbYtETZF-BlEw1Um6a3Bkb0qkxWE7d3AR9dyFsew-_HtMftPcbl0qli

分解成3NF的保持函数依赖的分解算法:的更多相关文章

  1. 分解成3NF保持函数依赖且为无损连接的算法

    分解成3NF保持函数依赖且为无损连接的算法: 1.根据分解成3NF的保持函数依赖的分解算法(http://www.cnblogs.com/bewolf/p/4443919.html),得到分解结果ρ ...

  2. 关系模式范式分解教程 3NF与BCNF口诀

    https://blog.csdn.net/sumaliqinghua/article/details/86246762 [通俗易懂]关系模式范式分解教程 3NF与BCNF口诀!小白也能看懂原创置顶 ...

  3. 萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  4. 百度在线笔试编程测试题(Python):整数分解成素数的积

    编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes ...

  5. 使用List把一个长字符串分解成若干个短字符串

    把一个长字符串分解成若干个固定长度的短字符串,由于事先不知道长字符串的长度,以及短字符串的数量,只能使用List. public static void get_list_sbody(String s ...

  6. .Net 将一个DataTable分解成多个DataTable

    这两天遇到一个问题,我们所接触 的一个系统在导出数据到Excel的时候,产生了内存溢出的错误.原因在于数据过大,它导出是将所有数据存放在一个DataSet的一个表中,再将这个数 据集放入session ...

  7. python3 读取大文件分解成若干小文件

    有个数据实在太大了,有1.7G,打开慢,改文件也慢,我们将其分解成若干个中等文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*-   f = open(& ...

  8. C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  9. js将用户上传gif动图分解成多张帧图片

    js将用户上传gif动图分解成多张帧图片 写在前面 工作中遇到一个这么一个需求:这是一个多图上传的场景,如果用户上传选择多张图片,则上传后直接展示多张图片,如果上传的图片是gif动图,则需要分解这张动 ...

随机推荐

  1. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  2. iOS 进阶 第六天(0402)

    0402 通知和代理的区别 代理是一对一的,只能是调用实现了协议里的方法,对象作为实现了该方法才能执行方法 通知是多对多,它是通过通知中心分发 通知要及时移除,如果不及时移除可能会收到多次通知,就好像 ...

  3. 【BZOJ 1068】[SCOI2007]压缩

    Description 给 一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M 标记重复串的开始,R重复从 ...

  4. c语言编程之栈(链表实现)

    用链表实现栈,完成了出栈入栈功能. #include"stdio.h" typedef int element; //define a struct descirbe a stac ...

  5. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  6. Android 自定义Toast,不使用系统Toast

    效果图: 创建Toast类 package com.example.messageboxtest; import android.app.Activity; import android.conten ...

  7. Flv 视频格式(转)

    最近要用到flv,整理了一些flv格式的资料,供参考. flv文件主要由两部分组成:header和body. 1.header header部分记录了flv的类型.版本等信息,是flv的开头,一般都差 ...

  8. IntelliJ IDEA的Maven项目在修改时报java.lang.OutOfMemoryError: PermGen space异常

    什么也不说了---内存溢出,遇见太多回了,下面是解决方式: 1.在项目设置中新建Maven,然后设置VM: 2. 在pom.xml添加下面2个插件,一个是jrebel的,一个是jetty的 <b ...

  9. uva 434

    贪心 ~ #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...

  10. Chp5: Bit Manipulation

    Bits Facts and Tricks x ^ 0s =  x x & 0s =  0 x | 0s = x x ^ 1s = ~x x & 1s = x x | 1s = 1s ...