数据库复习——数据库模式设计

Lbmttw_lx / 2023-05-06 / 原文

数据库模式设计如果不好会导致的问题:

  1.冗余
  2.导致数据一致性出现问题
  3.插入异常
  4.更新异常
  5.删除异常

函数依赖

  函数依赖是指一个或多个属性的取值可以确定另一个属性的取值。具体地说,如果一个关系模式R中属性集合X的取值能唯一地确定属性集合Y的取值,那么我们称属性集合Y对于属性集合X具有函数依赖。这被表示为X → Y,其中X称为函数依赖的左部,Y称为右部。

  例如,考虑一个包含学生信息的关系模式R,其中包含属性集合{学生ID,姓名,年龄,所在班级,班级导师}。假设我们观察到一个学生ID只对应一个姓名和年龄,那么我们可以说“学生ID函数依赖于姓名和年龄”,表示为{学生ID} → {姓名,年龄}。

  函数依赖在数据库设计中非常重要,因为它们可以帮助我们识别重复数据和设计表结构。如果我们正确地理解和应用函数依赖,就可以减少数据冗余,提高数据完整性和一致性。

数据库的键

 
  在关系型数据库中,键(key)是指一种特殊的属性或属性集合,用于唯一标识一个关系中的元组。键可以帮助我们在数据库中快速准确地定位、访问和修改数据。

关系数据库中的键可以分为以下三种类型:

  1. 主键(Primary Key):主键是一个关系中的一个或多个属性,用于唯一标识关系中的每个元组。主键具有以下特点:

    • 主键的值在关系中必须是唯一的。
    • 主键的值不能为空值(NULL)。
    • 一个关系只能有一个主键。
  2. 外键(Foreign Key):外键是一个关系中的属性,它引用了另一个关系的主键,用于建立两个关系之间的关系。外键具有以下特点:

    • 外键的值必须在另一个关系中存在,或者为空值(NULL)。
    • 一个关系可以有多个外键。
  3. 候选键(Candidate Key):候选键是一个关系中的一个或多个属性,它可以唯一标识关系中的每个元组,但不是主键。一个关系可以有多个候选键。而且不同候选键的元素个数可能不同!

  4. 超键(super key)是指可以唯一标识一个关系中的每个元组的属性集合。换句话说,一个超键的值集合可以唯一确定关系中每个元组的值。超键可以包含关系中的所有属性,也可以只包含部分属性。超键不一定是最小的,也就是说,可能存在多个超键可以唯一标识关系中的每个元组。

  键在数据库中非常重要,因为它们可以帮助我们维护数据的完整性和一致性。通过使用键,我们可以确保每个元组都具有唯一的标识符,从而避免数据冗余和不一致性。

寻找数据库的键

  函数依赖集合的闭包

  定义:在关系数据库中,函数集合的闭包是指一个函数集合中所有可能的函数依赖组合所得到的函数依赖集合。换句话说,函数集合的闭包包含了原函数集合中所有可能的函数依赖和派生函数依赖。通过寻找函数集合的闭包,我们可以了解关系模式中所有可能的函数依赖,从而更好地设计和优化关系模式。

  以下是寻找函数集合的闭包的方法:

   1. 初始闭包:将原函数集合中的所有函数依赖加入到闭包中。

   2. 递归添加:对于闭包中的每个函数依赖,找到其右部属性集合所能推导出的所有函数依赖,并将其添加到闭包中。

   3. 直到无法添加:重复步骤2,直到闭包中没有新的函数依赖可以添加为止。

  函数依赖的规则包括以下几条:

   1. 自反性规则:如果Y包含于X,则X → Y。

   2. 扩展性规则:如果X → Y,那么XZ → YZ,其中Z是关系R中除X、Y之外的任意属性集合。

   3. 传递性规则:如果X → Y,Y → Z,那么X → Z。

  这些规则可以用来推导出函数依赖的闭包。通过这些规则,我们可以确定关系模式中的主键、候选键和冗余属性,从而优化关系模式的设计和性能。
 
  通过函数依赖的闭包求解键的办法(暴力法):

   1. 确定关系中的属性集合:首先,确定关系中的所有属性集合,包括主属性和非主属性。

   2. 确定函数依赖集合:根据实际情况,确定关系中的所有可能函数依赖。一个函数依赖是指一个属性集合能够唯一确定另一个属性集合。例如,如果属性集合A能够唯一确定属性集合B,则称为A → B。

   3. 计算函数依赖的闭包:通过使用函数依赖的自反性、扩展性和传递性规则,计算关系中所有可能的函数依赖。这将给出一个包含原函数依赖和派生函数依赖的函数依赖集合,即函数依赖的闭包。

   4. 确定候选键:对于关系中的每个属性集合,检查是否可以唯一确定每个元组。如果可以,则该属性集合是一个候选键。如果有多个候选键,则需要确定一个主键。

   5. 检查主键是否在函数依赖闭包中:检查所选的主键是否在函数依赖闭包中。如果主键不在闭包中,则需要重新选择一个候选键作为主键。

  启发式算法:

   1. 不在任何函数依赖右边出现的属性必然是键的一部分。

   2. 不在函数依赖左边出现的属性一定不是键的一部分