当谈及数据库设计时,我们实际上在谈论如何组织和管理数据以支持应用程序或业务的需求。数据库设计的质量直接影响着系统的性能、可维护性和数据的完整性。那么怎么去设计数据库才可以尽可能地实现一个标准化的数据库呢?这就不得不提到三大范式
。
1. 三大范式的概念
1.第一范式(1NF):每个表中的每个列都是原子的,没有重复的列。
2.第二范式(2NF):确保非主键列完全依赖于主键,消除了部分依赖。
3.第三范式(3NF):消除了传递依赖,确保非主键列之间没有依赖关系。
这里还不是很明白,因为提到了一些概念。下面我们理清楚四个概念,然后再来看三大范式就十分简单了。依赖,完全依赖,部分依赖,间接依赖
依赖
由”一个字段的值可以推出另一个字段的值",我们说这两个字段之间有依赖关系,而且A可以推出B,A->B,则说B依赖于A,能被谁推出,就依赖谁
。假设假设我们有一个名为 “员工”(Employees)的表,其中包含以下几个字段:
员工ID(EmployeeID)
员工姓名(EmployeeName)
部门ID(DepartmentID)
部门名称(DepartmentName)
在这个表中,我们可以观察到以下依赖关系:
部门ID(DepartmentID)依赖于员工ID(EmployeeID),因为每个员工都分配给一个部门。
部门名称(DepartmentName)依赖于部门ID(DepartmentID),因为每个部门都有一个唯一的名称。
我们可以用箭头表示这些依赖关系:
EmployeeID -> DepartmentID
DepartmentID -> DepartmentName
这意味着部门ID依赖于员工ID,而部门名称依赖于部门ID。如果知道员工ID,就可以推出对应的部门ID;如果知道部门ID,就可以推出对应的部门名称。因此,这些字段之间存在依赖关系。
完全依赖(Full Dependency)
:
完全依赖发生在一个属性(或属性集)完全取决于另一个属性(或属性集)的值时。换句话说,如果属性A的值唯一地决定了属性B的值,那么属性B就完全依赖于属性A。
部分依赖(Partial Dependency)
:
部分依赖发生在一个属性(或属性集)依赖于另一个属性(或属性集)的一部分值时。换句话说,如果属性A的值只部分地决定了属性B的值,那么属性B就部分依赖于属性A。在具有单一主键的表中,如果一个属性依赖于主键的全部而不是部分,则可以说存在完全依赖。而如果一个属性仅依赖于主键的一部分,则可以说存在部分依赖。这种情况通常在具有复合主键的表中出现。
假如一张表有A,B,C,D,E四个字段,而且主键是(A,B,C),D和E是非主键字段,如果必须A+B+C才能推出D,而(A,B,C)的任何一个子集都无法推出D,就可以说D完全依赖于(A,B,C),如果(A,B,C)的一个子集就可以推出D,则说D部分依赖于(A,B,C)
间接依赖(Transitive Dependency)
:
间接依赖发生在一个属性依赖于另一个属性,而这个另一个属性又依赖于第三个属性的情况下。换句话说,如果属性A依赖于属性B,而属性B又依赖于属性C,则属性A间接依赖于属性C。不存在间接依赖的本质是:非主键之间没有依赖关系,即两个非主键字段之间不存在一个字段可以推出另一个字段的关系!!!
当你理解完这四个概念,再看什么是三大范式,简直就是轻松的一批:
1.第一范式
必须规定一个字段为主键,而且每个主键都不能再分
2.第二范式
非主键字段必须完全依赖于主键(一般是联合主键而不是单一主键),不能部分依赖于主键
3.第三范式
不能有依赖传递