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

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

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

注意

  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包
    该包几乎包含了这里要实现的所有算法,后面会一一介绍和贴代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值