范式理论的程序设计(一)
程序员文章站
2022-05-08 11:28:44
...
关于数据库范式理论的程序设计 - 开端
本篇主要介绍一些前提,算法实现部分会在后面的文章介绍。
注意
- 不会直接把项目和全部代码给出;
- 算法都是用《数据库系统概念》中的原生算法和注释;
- 更多地方都需要优化,一方面避免难读懂,更重要留给读者自己去实现、优化。
基本概念
前提描述,在关系模式R(A,B,C……..)中,存在一些约束(函数依赖和码),函数依赖集有:
F={α → β,γ → δ…………}。
- 关系模式R:对应关系型数据库中一张* ‘表’*的意思(会将R分解成很多表)
- R中(A,B….):对应表的列……
- 函数依赖(α → β):α 相同的每个元组(可以理解成表的一行某些列),β一定要相同
- 超键(超码):超键(super key)是R的子集,该子集对应的元组不会相同。
- 候选键(候选码):候选键(candidate key)是一个超键,肯定也是一个R的子集,并且子集的真子集都不是超键。
- 主键(主码):主键(primary key)是一个候选键,设计数据库时人为指定,一般选定其属性不常被修改的候选键。
范式
- 第一范式(1NF):关系模式R中的每个属性都不可再分。(能在关系型数据库中建成的表都会满足,没啥意义)
-
第二范式(2NF):满足以下其中一条,
(1)关系模式R的每一属性都在候选码中;
(2)非主属性A传递依赖于R的码。 - 主属性:候选键中的属性。
-
第三范式(3NF):满足以下其中一条,
(1)α → β是一个平凡的函数依赖;
(2)α 是R的一个超码;
(3)β 中每个属性A都包含在R的候选码中。 - 平凡函数:α → β且β包含于α 。如 AB → A
BC范式(BCNF):满足以下其中一条,
(1)α → β是一个平凡的函数依赖;
(2)α 是R的一个超码;不同书用不同的概念来定义,参考其他人文章:https://www.zhihu.com/question/24696366
创建项目
项目使用Java语言,而且使用Java 8的一些特性,Ctrl + C、Ctrl + V后请使用JDK1.8或更高版本编译。这里我直接创建一个简单的Java项目(IDE是使用IntelliJ IDEA)
-
项目结构
controll包是写一个简单JavaFX测试界面用的,不会介绍也不会贴代码。 -
nf包
该包是用于定义一些废话的,不会涉及到算法的实现,如果后面包装成软件也行有用,也不详细介绍也不会贴代码。
-
test包
主要存放算法测试的用例,当前大多数用例都是来源于《数据库系统概念》和一些exam,不会详细介绍,但会把测试代码给出。 -
bean包
该包主要放算法用到的Bean类,这里只会介绍里面的FunctionalDependency类(函数依赖)
详细代码:
package com.ruoxing.dbs.bean;
import com.ruoxing.dbs.util.SequenceUtils;
/**
* @author :ruoxing
* @type :Class
* @date :2018年5月
* @description :函数依赖 α → β
*/
public class FunctionalDependency implements SequenceUtils {
private static final String middle = "→";
private CharSequence left;
private CharSequence right;
public FunctionalDependency() {
}
public FunctionalDependency(CharSequence left, CharSequence right) {
setLeft(left);
setRight(right);
}
public CharSequence getLeft() {
return left;
}
public CharSequence getRight() {
return right;
}
public void setLeft(CharSequence left) {
this.left = sort(deDuplicate(left));
}
public void setRight(CharSequence right) {
this.right = sort(deDuplicate(right));
}
/**
* 描述:判断该FD是否是平凡的,即left包含right
*/
public boolean isTrivial() {
return contains(left, right);
}
/**
* 描述:获取函数依赖中出现的属性,这方法是补充的
*/
public String attributions() {
return sort(deDuplicate("" + left + right)).toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FunctionalDependency that = (FunctionalDependency) o;
if (left != null ? !left.equals(that.left) : that.left != null) return false;
return right != null ? right.equals(that.right) : that.right == null;
}
@Override
public int hashCode() {
int result = left != null ? left.hashCode() : 0;
result = 31 * result + (right != null ? right.hashCode() : 0);
return result;
}
@Override
public String toString() {
return left + middle + right;
}
}
-
util包
该包几乎包含了这里要实现的所有算法,后面会一一介绍和贴代码。
上一篇: 睡眠不好如何调理 5款粥安神又助眠
下一篇: 数据库表的设计基本思想