三大范式和闭包

闭包

在数据库理论中,闭包指的是一个集合。

闭包分为很多,在数据库中学了函数依赖的闭包,属性的闭包,自己学javascript的时候看了js的闭包,总的来说,闭包就是个集合。集合元素以及集合的函数依赖构成一个闭包。

JS中的闭包,来自知乎网友解释

1、
闭包本质还是函数,只不过这个函数绑定了上下文环境(函数内部引用的所有变量)。

2、
在函数式编程中,闭包的逻辑就是:『让程序运行环境来管理状态』。命令式语言围绕状态来建模,每次指令操作都在控制状态的变化,需要人为管理;而闭包是对行为的控制,将运行逻辑和上下文绑定,执行闭包的时候,逻辑和上下文是关联的,一个十分简单的例子:

const foo = () => {
let v = 1;
return () => {
return v++;
}
};
const bar = foo();
bar(); // -> 1
bar(); // -> 2
bar(); // -> 3

上面,foo 是一个普通函数,但是当它被执行后,连同 foo 内部作用域以及返回的匿名函数,构成了闭包函数 bar,其中变量 v 将由这个闭包在运行时自行管理,每次执行都会触发匿名函数的逻辑,将 v 的值增 1。

3、
闭包的特点很鲜明,闭包内,变量无法释放,无法被直接访问;闭包可以被延迟执行。所以可以用它来做一些事情:
管理私有变量和私有方法,将对变量(状态)的变化封装在安全的环境中
将代码封装成一个闭包形式,等待时机成熟的时候再使用,比如实现柯里化和反柯里化
需要注意的,由于闭包内的部分资源无法自动释放,容易造成内存泄露。


三大范式

三大范式是用来检测数据库模式设计好坏的。一般在数据库设计完成后再用他们来检测。

  • 第一范式
  • 第三范式
  • BC范式

判断方法

对于F(函数依赖的闭包)中所有形如a——>b中的函数依赖,以下

  • a——>b是一个平凡的函数依赖
  • a是R的一个超码
  • b-a中每个属性A都包含在R的一个候选码中。

符合上述三个条件任意一个都是满足第三范式,符合任意两个满足BC范式。而第一范式只要求属性是原子性的。