Press "Enter" to skip to content

优化数据存储:探索SQL中的数据类型和规范化

优化数据存储:探索SQL中的数据类型和规范化 四海 第1张

在当前世纪,数据是新的石油。优化这些数据存储对于获得良好的性能始终至关重要。选择合适的数据类型并应用正确的规范化过程对决定其性能至关重要。

本文将研究最重要和常用的数据类型,并了解规范化过程。

SQL中的数据类型

SQL中主要有两种数据类型:字符串和数值。除此之外,还有其他数据类型,如布尔、日期和时间、数组、区间、XML等。

字符串数据类型

这些数据类型用于存储字符字符串。字符串通常被实现为数组数据类型,包含一系列元素,通常是字符。

  1. CHAR(n):

它是一个固定长度的字符串,可以包含字符、数字和特殊字符。 n 表示字符串可以容纳的最大长度(以字符为单位)。

它的最大范围是从0到255个字符,这种数据类型的问题是,即使实际字符串的长度小于指定的长度,它也会占用全部指定的空间。额外的字符串长度会用额外的内存空间填充。

  1. VARCHAR(n):

Varchar与Char类似,但它可以支持可变大小的字符串,而且没有填充。该数据类型的存储大小等于字符串的实际长度。

它最多可以存储65535个字符。由于其可变大小的特性,其性能不如CHAR数据类型。

  1. BINARY(n):

它类似于CHAR数据类型,但只接受二进制字符串或二进制数据。它可以用于存储图像、文件或任何序列化对象。还有另一种数据类型VARBINARY(n),它类似于VARCHAR数据类型,但也只接受二进制字符串或二进制数据。

  1. TEXT(n):

这种数据类型也用于存储字符串,但最大大小为65535字节。

  1. BLOB(n): 代表二进制大对象,可容纳最多65535字节的数据。

除此之外还有其他数据类型,如LONGTEXT和LONGBLOB,可以存储更多字符。

数值数据类型

  1. INT():

它可以存储4字节(32位)的数字整数。这里的n表示显示宽度,最大可以达到255。它指定用于显示整数值的最小字符数。

范围:

  1. a) -2147483648 ≤ 有符号INT ≤ 2147483647
  2. b) 0 ≤ 无符号INT ≤ 4294967295
  1. BIGINT():

它可以存储最大64位的大整数。

范围:

  1. a) -9223372036854775808 ≤ 有符号BIGINT ≤ 9223372036854775807
  2. b) 0 ≤ 无符号BIGINT ≤ 18446744073709551615
  1. FLOAT():

它可以存储带有一定精度的小数。由于存在一些小的舍入误差,因此不适用于需要精确精度的情况。

  1. DOUBLE():

这个数据类型表示双精度浮点数,与FLOAT数据类型相比,它可以存储具有更高精度的小数值。

  1. DECIMAL(n, d):

这个数据类型表示具有固定精度d的精确十进制数。参数d指定小数点后的数字位数,参数n表示数字的大小。参数d的最大值为30,默认值为0。

 

其他一些数据类型

 

  1. BOOLEAN:

这个数据类型仅存储True或False两种状态。它用于执行逻辑操作。

  1. ENUM:

它代表枚举。它允许您从预定义选项列表中选择一个值。它还确保存储的值只能来自指定的选项。

例如,考虑一个属性color,它只能是'Red,' 'Green,' or 'Blue'。当我们将这些值放入ENUM中时,color的值只能是这些指定的颜色之一。

  1. XML:

XML代表可扩展标记语言。这个数据类型用于存储用于结构化数据表示的XML数据。

  1. AutoNumber:

这是一个整数,当每个记录添加时,它会自动增加其值。它用于生成唯一或连续的数字。

  1. Hyperlink:

它可以存储文件和网页的超链接。

这完成了我们对SQL数据类型的讨论。还有很多其他数据类型,但我们讨论的数据类型是最常用的。

 

SQL中的规范化

 

规范化是从数据库中删除冗余、不一致和异常的过程。冗余表示相同数据的重复值存在,而数据库中的不一致表示相同数据以多种格式存在于多个表中。

数据库异常可以定义为数据库中存在的任何突然变化或不一致。这些变化可能是由于数据损坏、硬件故障、软件错误等原因引起的。异常可能导致严重后果,如数据丢失或不一致,因此及早检测和修复它们是至关重要的。主要有三种类型的异常。我们将简要讨论每一种,但如果您想阅读更多,请参阅本文。

  1. 插入异常:

当新插入的行在表中创建不一致时,会发生插入异常。例如,我们想要向组织添加一个员工,但是他的部门没有分配给他。那么我们无法将该员工添加到表中,这会创建插入异常。

  1. 删除异常:

当我们想要从表中删除一些行,并且需要从数据库中删除其他数据时,会发生删除异常。

  1. 更新异常:

当我们想要更新某些行并导致数据库不一致时,会发生更新异常。

规范化过程包含一系列准则,使数据库设计高效、优化,并且没有冗余和异常。有几种规范形式,如1NF、2NF、3NF、BCNF等。

 

1. 第一范式(1NF)

 

第一范式确保表中不包含组合或多值属性。这意味着单个属性中只有一个值。如果每个属性只有单个值,则关系处于第一范式中。

例如-

  优化数据存储:探索SQL中的数据类型和规范化 四海 第2张  

在表1中,属性 STUD_PHONE 包含多个电话号码。但在表2中,该属性已经分解为第一范式。

 

2. 第二范式

 

表必须符合第一范式,且关系中不能存在任何部分依赖。部分依赖意味着非主属性(不是候选键的一部分的属性)部分地依赖或依赖于候选键的任何真子集。要使关系符合第二范式,非主属性必须是完全功能的,并且依赖于整个候选键。

例如,考虑一个名为 Employees 的表,它具有以下属性。

EmployeeID(主键)
ProjectID(主键)
EmployeeName
ProjectName
HoursWorked

 

这里,EmployeeID 和 ProjectID 一起形成主键。然而,你可以注意到 EmployeeName 和 EmployeeID 之间存在部分依赖。这意味着 EmployeeName 仅依赖于主键的一部分(即 EmployeeID)。为了实现完全依赖,EmployeeName 必须依赖于 EmployeeID 和 ProjectID。因此,这违反了第二范式的原则。

为了使这个关系符合第二范式,我们必须将表拆分为两个独立的表。第一个表包含所有员工的详细信息,第二个表包含所有项目的详细信息。

因此,Employee 表具有以下属性:

EmployeeID(主键)
EmployeeName

 

Project 表具有以下属性:

Project ID(主键)
Project Name
Hours Worked

 

现在你可以看到通过创建两个独立的表来消除部分依赖。两个表的非主属性都依赖于完整的主键集。

 

3. 第三范式

 

在第二范式之后,关系仍然可能存在更新异常。如果我们只更新一个元组而不更新另一个元组,就可能导致数据库的不一致。

第三范式的条件是表应该符合第二范式,并且非主属性不存在传递依赖关系。传递依赖关系发生在非主属性依赖于另一个非主属性而不是直接依赖于主属性的情况下。主属性是候选键的一部分。

考虑一个关系 R(A, B, C),其中 A 是主键,B 和 C 是非主属性。假设 A→B 和 B→C 是两个函数依赖,那么 A→C 就是传递依赖关系。这意味着属性 C 不是直接由 A 决定的。B 在它们之间充当中间人的角色。

如果一个表中存在传递依赖关系,我们可以通过将表拆分为单独的独立关系来使表符合第三范式。

 

4. Boyce-Codd范式

 

虽然第二范式和第三范式消除了大部分冗余,但冗余仍然没有完全消除。如果函数依赖的左侧不是候选键或超键,就可能出现冗余。一个候选键由主属性组成,而超键是候选键的超集。为了解决这个问题,还有一种称为Boyce Codd范式(BCNF)的函数依赖类型。

对于一个表来说,它要符合BCNF,函数依赖的左侧必须是候选键或超键。例如,对于函数依赖 X→Y,X 必须是候选键或超键。

考虑一个包含以下属性的员工表。

  1. 员工ID(主键)
  2. 员工姓名
  3. 部门
  4. 部门负责人

  优化数据存储:探索SQL中的数据类型和规范化 四海 第3张  

EmployeeID是唯一标识每行的主键。Department属性表示特定员工所在的部门,Department Head属性表示特定部门的负责人的员工ID。

现在我们将检查此表是否符合BCNF。条件是功能依赖的左手边必须是超键。以下是该表的两个功能依赖。

功能依赖1:Employee ID → Employee Name,Department,Department Head

功能依赖2:Department → Department Head

对于FD1,EmployeeID是主键,也是超键。但对于FD2,Department不是超键,因为多个员工可以在同一个部门中。

因此,此表违反了BCNF的条件。为满足BCNF的属性,我们需要将该表拆分为两个单独的表:Employees和Departments。Employees表包含EmployeeID,EmployeeName和Department,而Department表将包含Department和Department Head。

  优化数据存储:探索SQL中的数据类型和规范化 四海 第4张   优化数据存储:探索SQL中的数据类型和规范化 四海 第5张  

现在我们可以看到两个表中的所有功能依赖都依赖于主键,即没有非平凡的依赖关系。

我们已经介绍了所有著名的规范化技术,但除此之外还有两个规范形式,即4NF和5NF。如果您想了解更多信息,请参阅GeeksForGeeks的这篇文章。

 

总结

 

我们已经讨论了SQL中最常用的数据类型以及数据库管理系统中重要的规范化技术。在设计数据库系统时,我们的目标是使其可扩展,减少冗余并确保数据完整性。

通过选择适当的数据类型,我们可以在存储、精度和内存消耗之间取得微妙的平衡。此外,规范化过程有助于消除数据异常并使模式更加有组织。

就是这些了。在那之前,继续阅读和学习。     Aryan Garg是一名电气工程学士学位学生,目前在本科的最后一年。他对Web开发和机器学习领域很感兴趣。他已经追求了这个兴趣,并渴望在这些方向上更多地工作。  

Leave a Reply

Your email address will not be published. Required fields are marked *