关于数据库范式理论的程序设计 - NormalFormUtils
这里我使用的工具类全部都是使用接口,public interface NormalFormUtils extends FcUtils 是关于范式的判定、分解的工具。这里要介绍的内容和代码都非常多
Utils工具的继承关系
NormalFormUtils接口
这部分内容由于之前写的代码涉及到其他的内容,所以这里重写了几次,做了很多的删减,后面或许会再补充其他内容。
BCNF的判定
1. 算法描述
2. 算法代码
/**
* 描述:找到一个Ri中违反BCNF的函数依赖
* @param fds 函数依赖集
* @param attributeRi R分解后的Ri属性集
* @return FunctionalDependency或者null
*/
default FunctionalDependency violateBCNF(Collection<FunctionalDependency> fds, String attributeRi) {
//(1)计算Ri中属性的每一个子集(即字符的组合) α,确保α+(在Pattern下的属性闭包)
//计算Ri属性的所有子集
final Collection<String> combinations = combination(attributeRi);
for (CharSequence combination : combinations) {
//计算α+
final String closure = calcClosure(combination.toString(), fds);
//(2)满足则Ri属于BCNF的条件
//α+要么不含 (Ri-α)的任何属性
final boolean empty = isEmpty(intersect(closure, except(attributeRi, combination)).toString());
//要么包含Ri的所有属性
final boolean contains = contains(closure, attributeRi);
if (empty || contains) continue;
//一定存在α → (α+ - α) ∩ Ri 违反BCNF
final FunctionalDependency fd = new FunctionalDependency(combination, intersect(except(closure, combination), attributeRi));
System.err.println("[" + attributeRi + "]中" + fd + "违反BCNF...................");
return fd;
}
return null;
}
BCNF的分解
1. 算法描述
如果直接将关系模式R按照该算法进行分解,那么该算法与计算F+没什么区别。所以该算法应该用于R分解为多个Ri后,如果有些Ri不满足BCNF再用该算法分解。后面会有利用正则覆盖Fc对R进行3NF分解,分解得到的多个Ri。如果要的到BCNF,这时候就可以使用该算法对这些Ri进行分解。
2. 算法代码
/**
* 描述:R分解为多个BCNF
* @param fds 函数依赖F
* @param attributeR R的属性集
* @return Set<String> 满足BCNF的Ri.....
*/
default Set<String> decomposeBCNF(Collection<Func