BCNF范式及其分解方法(对一次Lab作业的总结)

一次Lab的作业题目如下:

A luxury car-rental company has been tracking their rental data in a simple spreadsheet, but now wants to migrate to a proper database. Consider the table given below, containing some sample data.

(a) Identify at least 10 functional dependencies (non-trivial with minimal LHS) that hold on the table above.

(b) Classify the functional dependencies found as either ‘sensible’ or ‘accidental’.

给了个这个租车表,要求写函数依赖关系,这里只写sensible的,accidental的没有固定标准,不写。

依赖如下:

plate->make
make ->daily_rate
license_nr->dob
license_nr->name
plate+start_date ->*  (*表示除这两项之外的剩余部分都可以表示)

考虑到一个人(一个驾照可以租很多车,所以还需要租车的开始时间或者结束时间来区分)

其他的不用解释了

这里为了突出传递函数依赖,将plate,make,daily_rate分开,理解为车牌号决定厂家,厂家决定该车型每日收入,同一车型收费应该都相同,所以为互相依赖。

剩余的依赖关系都为部分函数依赖

建表如下:

建立4个表

table1
plate start_date end_date license_nr  (plate start_date为主键)

table 2
name dob license_nr  (license_nr为主键)

table3和table4传递关系 分开写

table 3
plate make

table 4
make daily_rate

转载一篇博文,有关BCNF的分解算法的:

原文地址:https://www.cnblogs.com/northernmashiro/p/8981391.html

时间: 2024-10-31 11:27:48

BCNF范式及其分解方法(对一次Lab作业的总结)的相关文章

bcnf范式

3.5范式--bcnf范式到底是什么呢? 对于bcnf范式,通过查阅资料,我的理解是--主键依赖的去除.比如说:一个仓库管理的表格,有以下属性(管理员编号,仓库号,货物编号,货物数量)其中每个管理员管理一个仓库,那么就会出现这样的情况: 1.仓库号和货物编号可以确定货物数量,仓库号和货物编号可以确定管理员编号. 2.管理员编号和货物编号可以确定仓库号,管理员编号和货物编号可以确定货物数量. 3.仓库号可以确定管理员编号. 4.管理员编号可以确定仓库号. 其中,仓库号.管理员编号和货物编号都是主属

小酌重构系列[4]——分解方法

概述 "分解方法"的思想和前面讲到的"提取方法"."提取方法对象"基本一致.它是将较大个体的方法不断的拆分,让每个"方法"做单一的事情,从而提高每个方法的可读性和可维护性.分解方法可以看做是"提取方法"的递归版本,它是对方法反复提炼的一种重构策略. 分解方法 下图表示了这个重构策略,第1次提炼和第2次提炼都采用了"提取方法"这个策略. 何时分解方法? "分解方法"最终

基于One-Class的矩阵分解方法

在矩阵分解中. 有类问题比較常见,即矩阵的元素仅仅有0和1. 相应实际应用中的场景是:用户对新闻的点击情况,对某些物品的购买情况等. 基于graphchi里面的矩阵分解结果不太理想.调研了下相关的文献,代码主要实现了基于PLSA的分解方法,具体请參考后面的參考文献 #!/usr/local/bin/python #-*-coding:utf-8-*- import sys import math import numpy as np import string import random "&q

分解方法

分解方法 概述 “分解方法”的思想和前面讲到的“提取方法”.“提取方法对象”基本一致.它是将较大个体的方法不断的拆分,让每个“方法”做单一的事情,从而提高每个方法的可读性和可维护性.分解方法可以看做是“提取方法”的递归版本,它是对方法反复提炼的一种重构策略. 分解方法 下图表示了这个重构策略,第1次提炼和第2次提炼都采用了“提取方法”这个策略. 何时分解方法? “分解方法”最终可以让方法的可读性极大地增强,通常我们可以依据以下几点来辨别方法是否需要分解: 1. 每个方法应该只做一件事情(对事情的

MPI程序的任务分解方法

用MPI编写并行程序时,任务分解是很重要的一部分,如何把T个任务(T块数据,T行矩阵等)分给P个进程,实现负载均衡,是需要好好考量的问题.分解任务时需要解决两个问题: 1.给出一个进程p,如何得知要处理的任务是哪些 2.给出一个任务t,如何得知它是由哪个进程处理的 (这里的p和t都是从0开始计数.) 一个好的任务分配,应该能够保证这两种计算都能高效完成.下面讨论三种分配方式.这里只讨论T>P的情况,T<=P时的分解方式是显而易见的. 一,交叉分解 对于进程p,它所处里的任务号为t=p+kP,其

重构第22天 分解方法(Break Method)

理解:如果一个功能,里面比较复杂,代码量比较多,我们就可以把这个功能分解成多个小的method,每个方法实现该功能的一个小小的部分,并且方法命名成容易理解,和方法内容相关的名称,更有助于维护和可读性提高. 详解: 重构前代码: 1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace

数据库学习笔记_9_BNCF与3NF范式以及分化方法

上次笔记讲到了函数依赖 functional dependency, 那么现在讲的这个boyce-codd normal form and the third normal form is based on the concept of FD. BCNF的条件: 对于一个关系中存在的任何一个函数依赖,其必须满足以下两个条件中的一个: 1.这个函数依赖是自导的(不重要的 trivial) 2.对于依赖LA(a)->LA(b),LA(a)为该关系的一个超键. 而3nf的条件则是在bcnf上多加了一个

BCNF/3NF的判断方法

判断是否是 3NF 的条件: 对于 R 上的每个函数依赖 X->A (X 是关系 R 属性的一个子集,A 是 R 的一个属性) ,以下条件中的一个成立:1 X ∈ A2 X 是超码3 A 是 R 的码的一部分 判断是否是 BCNF 的条件:对于 R 上的每个函数依赖 X->A(X 是关系 R 属性的一个子集,A 是 R 的一个属性) ,以下条件中的一个成立:1 X ∈ A2 X 是超码 例子如下: (a).{ACD}+= {A.C.D.B.E}{BCD}+={B.C.D.E.A}{EDC}+=

数据库范式理论

1NF范式:没有非原子属性 2NF范式:消除了非主属性的部分依赖 3NF范式:消除了非主属性的传递依赖 BCNF范式:消除了主属性的传递依赖 4NF范式:消除了多值依赖 模式分解的两个评价标准: 1.分解的无损性 2.分解的依赖性 两个问题: 1.如何识别无用属性? 2.如何求取正则覆盖? BCNF范式的分解过程是什么?