关系规范化之满足第三范式3NF的函数依赖保持分解算法

满足第三范式3NF的函数依赖保持分解算法

----------------------------------------------------------------------------------------------------------------------------------------------------------

输入:关系模式R和函数依赖集合F

输出:结果为满足第三范式的一个依赖保持的分解 

条件:

1.如果R中有某些属性与F的最小覆盖Fmin中的左边右边都没有关系,则这个(些)属性构成一个关系模式。如果没有就进行2 

2. 如果Fmin中有一个函数依赖涉及R中的所有属性,则输出R。否则,进行3

3.对于Fmin,其中有X->Ai这样的函数依赖,则添加XAi到一个分解集合p中,但是当X->A1,X->A2,...,X->An时(即X可与决定Fmin中多个属性),用XA1A2...An来替换之前的XAi 

----------------------------------------------------------------------------------------------------------------------------------------------------------

回顾一下什么是1NF,2NF,3NF以及BCDF:http://blog.csdn.net/scnujack/article/details/6539642

----------------------------------------------------------------------------------------------------------------------------------------------------------

程序:

//满足第三范式3NF的函数依赖保持分解算法
//输入:关系模式R和函数依赖集合F
//输出:结果为满足第三范式的一个依赖保持的分解 
//条件:1.如果R中有某些属性与F的最小覆盖Fmin中的左边右边都没有关系,则这个(些)属性构成一个关系模式。如果没有就进行2 
//2. 如果Fmin中有一个函数依赖涉及R中的所有属性,则输出R。否则,进行3
//3.对于Fmin,其中有X->Ai这样的函数依赖,则添加XAi到一个分解集合p中,但是当X->A1,X->A2,...,X->An时(即X可与决定Fmin中多个属性),用XA1A2...An来替换之前的XAi 
#include 
#include 
using namespace std;

struct FunctionDependence//函数依赖 
{
	string X;//决定因素 
	string Y;	
};

struct Hash//散列 
{
	int num;//用来记录字符串出现的次数 
	string s; 
};

void Init (FunctionDependence FD[],int n)
{
	//函数依赖关系初始化
	int i;
	string x,y;
	cout<<"请输入F中的函数依赖(决定因素在左,被决定因素在右)"<>x>>y;
		FD[i].X=x;
		FD[i].Y=y;	
	} 
	cout<<"函数依赖集合"; 
	cout<<"F={" ;
	for (i=0;i"<=1)
		ss+=(char)ii;
	} 
	return ss;
} 

bool IsIn(string f,string zz)//能够判断F中决定因素f里所有的因素是否在X中,但这样可能导致结果出现重复 
{
	bool flag1=false;
	int len1=f.length();
	int len2=zz.length();
	int k=0,t=0,count1=0;
	for (k=0;kright
void  Cut(FunctionDependence FD[],int n,string left,string right,FunctionDependence Dyna[])
{	
	int i=0,j=0,count=0;
	for (i=0;i"<"<"<"<"<"<A,X=B1B2..Bm,A属于{X去掉某个其中的属性Bi的闭包} 
			{
				Dyna[i].X= temp_x;
			}
		}
			
	}
	//求得最小覆盖 
	cout<"<"<> A;
	int lengthR = A.length();
	cout<<"关系模式R={";
	for (int i = 0;i>N;
	//第一步:求出F的最小覆盖 
	FunctionDependence fd[N];
	//FunctionDependence Dyna3[N+20];
	Fmin(fd,N);

	//第二步:如果R中有某些属性与F的最小覆盖Fmin中的左边右边都没有关系,则这个(些)属性构成一个关系模式。如果没有就进行2 
	
	int count_i = 0,count=0;
	string R[lengthR+20];

	Hash left_type[lengthR+20];//用来储存Fmin的不同决定因素 
	int temp1=0,l_type=0,l_num=0;
	for (int n=0;nAi这样的函数依赖,则添加XAi到一个分解集合p中,但是当X->A1,X->A2,...,X->An时(即X可与决定Fmin中多个属性),用XA1A2...An来替换之前的XAi 
	if (my_flag==0)
	{
			for (int m=0;m


关系规范化之满足第三范式3NF的函数依赖保持分解算法_第1张图片

其中求最小覆盖等函数,沿用或者部分改变自之前编写的函数,如有疑问可以查看之前的文章。


你可能感兴趣的:(错误合集)