欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

范式理论的程序设计(一)

程序员文章站 2022-05-08 11:28:44
...

关于数据库范式理论的程序设计 - 开端

本篇主要介绍一些前提,算法实现部分会在后面的文章介绍。

注意

  1. 不会直接把项目和全部代码给出;
  2. 算法都是用《数据库系统概念》中的原生算法和注释;
  3. 更多地方都需要优化,一方面避免难读懂,更重要留给读者自己去实现、优化。

基本概念

前提描述,在关系模式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包
    该包几乎包含了这里要实现的所有算法,后面会一一介绍和贴代码。