SQL中的数据类型和规范化,助力数据存储优化

news2024/11/24 13:26:47

大家好,目前优化数据存储对于获得良好的性能始终至关重要,选择合适的数据类型并应用正确的规范化过程对于决定其性能至关重要。本文将介绍最重要和最常用的数据类型和规范化过程。

一、SQL中的数据类型

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

1.字符串数据类型

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

(1) CHAR(n)

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

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

(2) VARCHAR(n)

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

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

(3) BINARY(n)

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

(4) TEXT(n)

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

(5) BLOB(n)

代表二进制大对象,可以容纳最多65535字节的数据。

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

2.数字数据类型

(1) INT()

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

范围:

  • a) -2147483648<=Signed INT<=2147483647

  • b) 0<=Unsigned INT<=4294967295

(2) BIGINT()

它可以存储一个大小为64位的大整数。

范围:

  • a) -9223372036854775808<=Signed BIGINT<=9223372036854775807

  • b) 0<=Unsigned BIGINT<=18446744073709551615

(3) FLOAT():

它可以存储浮点数,其小数点位以一定精度近似。它存在一些小的舍入误差,因此在需要精确精度的情况下不适用。

(4) DOUBLE():

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

(5) DECIMAL(n, d):

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

3.一些其他数据类型

(1) BOOLEAN

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

(2) ENUM

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

例如,考虑一个只能是“红色”、“绿色”或“蓝色”的属性颜色。当我们将这些值放入ENUM中时,颜色的值只能是这些指定的颜色之一。

(3) XML

XML代表可扩展标记语言(eXtensible Markup Language)。这种数据类型用于存储XML数据,XML数据用于结构化数据表示。

(4) AutoNumber

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

(5) Hyperlink

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

关于SQL数据类型的讨论到此为止。其他数据类型还有很多,但本文所讨论的是最常用的数据类型。

二、SQL中的规范化

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

数据库异常可以定义为数据库中不应存在的任何突然变化或不一致。这些变化可能是由于各种原因引起的,例如数据损坏、硬件故障、软件错误等。异常情况可能导致严重后果,如数据丢失或不一致,所以尽快检测和修复异常情况至关重要,主要有三种类型的异常情况。本文将简要讨论每种类型。

  • 插入异常:

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

  • 删除异常:

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

  • 更新异常:

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

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

1. 第一范式(1NF)

第一范式确保表中不包含复合或多值属性。这意味着单个属性中只有一个值。如果每个属性都是单值的,那么关系就符合第一范式。

例如:

图片

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

2. 第二范式(2NF)

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

例如,考虑一个名为Employee的表,具有以下属性:

EmployeeID (Primary Key)
ProjectID (Primary Key)
EmployeeName
ProjectName
HoursWorked

在这里,EmployeeID和ProjectID共同构成主键。不过,你可以注意到EmployeeName和EmployeeID之间存在部分依赖关系。这意味着EmployeeName只依赖于主键的一部分(即EmployeeID)。要实现完全依赖,EmployeeName必须同时依赖于EmployeeID和ProjectID。因此,这违反了第二范式的原则。

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

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

EmployeeID (Primary Key)
EmployeeName

Project表具有以下属性:

Project ID (Primary Key)
Project Name
Hours Worked

现在可以看到,通过创建两个独立的表,部分依赖关系已经被消除。而且两个表的非主属性依赖于完整的主键集合。

3. 第三范式(3NF)

在第二范式之后,关系仍然可能存在更新异常。如果我们只更新了一个元组而不更新其他元组,就会出现这种情况。这将导致数据库的不一致性。

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

考虑一个关系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必须是候选键或超键。

考虑一个包含以下属性的Employee表:

  1. 员工ID(主键)

  2. 员工姓名

  3. 部门

  4. 部门负责人

图片

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

现在,我们将检查这个表是否符合BCNF。条件是函数依赖关系的左侧必须是超键。下面是该表的两个函数依赖关系。

  • 函数依赖关系1:员工ID→员工姓名,部门,部门负责人

  • 函数依赖关系2:部门→部门负责人

对于FD1,员工ID是主键,也是超键。但对于FD2,部门不是超键,因为多个员工可能属于同一个部门。

因此,这个表违反了BCNF的条件。为了满足BCNF的属性,我们需要将该表拆分为两个独立的表:Employee表和Department表。Employee表包含员工ID、员工姓名和部门,而Department表则包含部门和部门负责人。

图片

图片

现在我们可以看到,在这两个表中,所有的函数依赖关系都依赖于主键,即不存在非三维依赖关系。

 

综上,本文讨论了SQL中最常用的数据类型以及数据库管理系统中重要的规范化技术,在设计数据库系统时,我们的目标是使其具有可扩展性,最小化冗余并确保数据完整性。通过选择适当的数据类型,我们可以在存储、精度和内存消耗之间取得微妙的平衡,同时规范化过程有助于消除数据异常并使数据库模式更有组织性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前沿学习】美国零信任架构发展现状与趋势研究

转自&#xff1a;美国零信任架构发展现状与趋势研究 摘要 为了应对日趋严峻的网络安全威胁&#xff0c;美国不断加大对零信任架构的研究和应用。自 2022 年以来&#xff0c;美国发布了多个零信任战略和体系架构文件&#xff0c;开展了多项零信任应用项目。在介绍美国零信任战略…

Numpy数组进阶_Python数据分析与可视化

Numpy数组进阶 Numpy的广播机制高级索引整数数组索引布尔索引花式索引 数组迭代 Numpy的广播机制 广播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组&#xff0c;进行数值计算的方式。 对数组的算术运算通常在相应的元素上进行&#xff0c;当运算中的 2 个数组的形状不同时…

DNS1(Bind软件)

名词解释 1、DNS&#xff08;Domain Name System&#xff09; DNS即域名系统&#xff0c;它是一个分层的分布式数据库&#xff0c;存储着IP地址与主机名的映射 2、域和域名 域为一个标签&#xff0c;而有多个标签域构成的称为域名。例如hostname.example.com&#xff0c;其…

java接收前端easyui datagrid传递的数组参数

这篇文章分享一下怎么在easyui的datagrid刷新表格时&#xff0c;在后端java代码中接收datagrid传递的数组参数。 数组来源于技能的tagbox&#xff08;标签框&#xff09;&#xff0c;tagbox和combobox的区别是tagbox可以选择多项。 标签框渲染的代码为 $("#skill_ids"…

分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测

分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测 目录 分类预测 | Matlab实现PSO-BiLSTM-Attention粒子群算法优化双向长短期记忆神经网络融合注意力机制多特征分类预测分类效果基本描述程序设计参考资料 分类效果…

ubuntu 23.04从源码编译安装rocm运行tensorflow-rocm

因为ubuntu22.04的RDP不支持声音转发&#xff0c;所以下载了ubuntu23.04.但官方的rocm二进制包最高只支持ubuntu22.04&#xff0c;不支持ubuntu 23.04&#xff0c;只能自己从源码编译虽然有网友告诉我可以用docker运行rocm。但是我已经研究了好几天&#xff0c;沉没成本太多&am…

12v24v60v高校同步降压转换芯片推荐

12V/24V/60V 高校同步降压转换芯片推荐&#xff1a; 对于需要高效、稳定、低噪音的降压转换芯片&#xff0c;推荐使用WD5030E和WD5105。这两款芯片都是采用同步整流技术&#xff0c;具有高效率、低噪音、低功耗等优点&#xff0c;适用于各种电子设备。 WD5030E是一款高效率…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

Microsoft发布了一份关于其产品安全修复的 11 月报告。

&#x1f47e; 平均每天有 50 多个漏洞被发现&#xff0c;其中一些会立即被网络犯罪分子利用。我们把那些现在很受网络犯罪分子欢迎&#xff0c;或者根据我们的预测&#xff0c;在不久的将来可能会被大量利用的漏洞称为趋势漏洞。 在攻击者开始利用这些漏洞之前 12 小时&#…

adb手机调试常用命令

查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…

flutter web 中嵌入一个html

介绍 flutter web 支持使用 HtmlElementView嵌入html import dart:html; import dart:ui as ui; import package:flutter/cupertino.dart;class WebWidget extends StatelessWidget {const WebWidget({super.key});overrideWidget build(BuildContext context) {DivElement fr…

【二分法】

二分法可以在有序排列中&#xff0c;通过不断对半切割数据&#xff0c;提高数据查找效率。 lst [1,4,6,7,45,66,345,767,788,999] n 66 left 0 right len(lst)-1 while left < right: #边界&#xff0c;当右边比左边还小的时候退出循环 mid (left right)//2 …

vue2项目修改编译巨慢

前言&#xff1a;我们的一个vue项目在给新同事后他说编译贼慢&#xff0c;一个小修改项5分钟才能自动编译成功&#xff0c;我把项目放到新电脑上也巨慢&#xff0c;升级了nodejs好使了一些&#xff0c;但还是慢&#xff0c;最后引入webpack后巨快&#xff0c; 在项目的package…

大功率电源芯片WD5030L

电源管理芯片作为现代电子设备中最关键的元件之一&#xff0c;直接影响着设备的性能和效率。而大功率电源芯片作为电源管理芯片中的一种&#xff0c;其性能和应用领域更加广泛。本文将介绍一款具有宽VIN输入范围、高效率和多种优良性能的大功率电源芯片WD5030L&#xff0c;并探…

ubuntu20.04安装cv2

查看ubuntu的版本 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE20.04 DISTRIB_CODENAMEfocal DISTRIB_DESCRIPTION"Ubuntu 20.04.3 LTS"更改镜像源 cp /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.listdeb http://mirr…

Python框架篇(2):FastApi-参数接收和验证

提示: 如果想获取文章中具体的代码信息&#xff0c;可在微信搜索【猿码记】回复 【fastapi】即可。 1.参数接收 1.1 路径参数(不推荐) 1.代码清单 在app/router下&#xff0c;新增demo_router.py文件,内容如下: from fastapi import APIRouterrouter APIRouter( prefix&qu…

MathType2024最新word公式编辑器

使用word进行论文编写时&#xff0c;常需要使用公式编辑器&#xff0c;但有些word中并没有公式编辑器&#xff0c;这时应该怎么办呢&#xff1f;本文将围绕word里没有公式编辑器怎么办&#xff0c;word中的公式编辑器怎么用的内容进行介绍。 一、word里没有公式编辑器怎么办 …

全新的FL studio21.2版支持原生中文FL studio2024官方破解版

FL studio2024官方破解版是一款非常专业的音频编辑制作软件。目前它的版本来到了全新的FL studio21.2版&#xff0c;支持原生中文&#xff0c;全面升级的EQ、母带压线器等功能&#xff0c;让你操作起来更加方便&#xff0c;该版本经过破解处理&#xff0c;用户可永久免费使用&a…

性能测试【第三篇】Jmeter的使用

线程数:10 ,设置10个并发 Ramp-Up时间(秒):所有线程在多少时间内启动,如果设置5,那么每秒启动2个线程 循环次数:请求的重复次数,如果勾选"永远"将一直发送请求 持续时间时间:设置场景运行的时间 启动延迟:设置场景延迟启动时间 响应断言 响应断言模式匹配规则 包括…

【编译原理】Chapter1概述

课程主要内容&#xff1a;程序设计语言编译程序构造的基本原理和基本实现技术 文章目录 什么是编译程序为什么要学编译原理计算思维(Computational Thinking)学习意义编译原理和方法的应用 编译过程概述词法分析语法分析中间代码生成优化目标代码产生 编译程序的结构编译程序总…