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

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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【文献阅读】Self similarity driven color demosaicking

[PDF][Code] 1. 摘要 每个像素只测量一种颜色成分&#xff0c;红色、绿色或蓝色&#xff0c;人们可以在每个像素推断出整个颜色信息。这种推断需要深刻理解颜色之间的相互作用&#xff0c;以及图像局部几何的参与。虽然在以非常小的相对误差进行这种推断方面非常成功&#xff…

深入C++ Vector:解密vector的奥秘与底层模拟实现揭秘

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; &#x1f354;前言&#xff1a; 我们学习了STL中的string以及其所有重要接口并进行了模拟实现&#xff0c;但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector&#xff0c;学习成本会大大降低&#…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本&#xff0c;三段相同结构的数据&#xff0c;想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…

实用技巧:在C和cURL中设置代理服务器爬取www.ifeng.com视频

概述&#xff1a; 网络爬虫技术作为一种自动获取互联网数据的方法&#xff0c;在搜索引擎、数据分析、网站监测等领域发挥着重要作用。然而&#xff0c;面对反爬虫机制、网络阻塞、IP封禁等挑战&#xff0c;设置代理服务器成为解决方案之一。代理服务器能够隐藏爬虫的真实IP地…

MySQL JDBC编程

MySQL JDBC编程 文章目录 MySQL JDBC编程1. 数据库编程的必备条件2. Java的数据库编程&#xff1a;JDBC3. JDBC工作原理4. JDBC使用5. JDBC常用接口和类5.1 JDBC API5.2 数据库连接Connection5.3 Statement对象5.4 ResultSet对象 1. 数据库编程的必备条件 编程语言&#xff1a;…

web:[BUUCTF 2018]Online Tool

题目 打开页面显示如下&#xff0c;进行代码审计 上述代码主要功能是接收‘host’参数&#xff0c;后使用nmap扫描主机端口 首先检查是否存在HTTP_X_FORWARDED_FOR头&#xff0c;若存在&#xff0c;将值赋值给EMOTE_ADDR,是为了跟踪用户真实的IP地址 后用检查get‘host’是否…

第十九章,Java绘图

Graphics类 Graphics类是所有图形上下文的抽象基本类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制 Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等 Graphics类提供了常用的绘图方法&#xff0c;利用这些…

Ubuntu 18.04无网络连接的n种可能办法

文章目录 网络图标消失&#xff0c;Ubuntu无网络连接VMware上Ubuntu18.04&#xff0c;桥接了多个网卡&#xff0c;其中一个用来上网&#xff0c;均设置为静态ip网络桥接链路没有接对路由不对 网络图标消失&#xff0c;Ubuntu无网络连接 sudo service network-manager stop sud…

家庭网络中的组网方式

家庭网络中&#xff0c;目前也衍生出了比较多的组网方式&#xff0c;也不是只有Easymesh&#xff0c;我们还是要辩证的去看&#xff0c;没有绝对的好和坏&#xff0c;需求不同&#xff0c;取舍不同。 这里博主简单的介绍几种组网方式&#xff0c;上图也比较直观 1.wds wds是…

系列九、对象的生命周期和GC

一、堆细分 Java堆从GC的角度还可以细分为&#xff1a;新生代&#xff08;eden【伊甸园区】、from【幸存者0区】、to【幸存者1区】&#xff09;和老年代。 二、MinorGC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区&#xff0c;年龄1 首先&#xff0c;当eden区…

日本水稻(Oryza sativa Japonica rice)的基因组染色质长度 IRGSP-1.0

创作日志&#xff1a; 在看scHi-C综述的时候发现了一个在2021年发布在Nature Plants上的数据集&#xff0c;想拿来用&#xff0c;首先就要知道其对应的水稻品种以及染色质长度。最终在UCSC上找到了对应的组装好的基因组&#xff0c;版本名为 IRGSP-1.0。 UCSC链接&#xff1a;h…

如何让普通用户使用sudo?

一、sudo的作用 sudo就是可以让我们的普通用户以root身份去做一些事情&#xff0c;这相当于给普通用户提升了权限&#xff0c;但是并不是每个普通用户都可以随便拿到root的提权的&#xff0c;也就是sudo是要经过一定处理才可以给普通用户使用&#xff0c;那么如何处理呢&#x…

pytorch.nn.Conv1d详解

通读了从论文中找的代码&#xff0c;终于找到这个痛点了&#xff01; 以下详解nn.Conv1d方法 1 参数说明 in_channels(int) – 输入信号的通道。 out_channels(int) – 卷积产生的通道。 kernel_size(int or tuple) - 卷积核的尺寸&#xff0c;经测试后卷积核的大小应为in_cha…

OpenCV图像纹理

LBP描述 LBP&#xff08;Local Binary Pattern&#xff0c;局部二值模式&#xff09;是一种用来描述图像局部纹理特征的算子&#xff1b;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikinen, 和D. Harwood 在1994年提出&#xff0c;用于纹理特征提取…

【深度学习实验】网络优化与正则化(六):逐层归一化方法——批量归一化、层归一化、权重归一化、局部响应归一化

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

使用uniapp写小程序,真机调试的时候不显示log

项目场景&#xff1a; 当小程序文件太大的情况下使用真机调试&#xff0c;但是真机调试的调试器没有任何反应 问题描述 使用uniapp写小程序&#xff0c;真机调试的时候不显示log 原因分析&#xff1a; 提示&#xff1a;因为真机调试的时候没有压缩文件&#xff0c;所以调试的…

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求&#xff0c;要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍&#xff0c;每个项目的需求又都有点儿不一样&#xff0c;迭代了很多版&#xff0c;所以抽时间把这个功能封装了…

基于STM32婴儿床检测控制系统及源程序

一、系统方案 1、本设计采用STM32单片机作为主控器。 2、DHT11检测湿度&#xff0c;液晶OLED显示&#xff0c;声音检测声音&#xff0c;有声音或尿床&#xff0c;蜂鸣器报警。 3、手机APP可以控制音乐播放。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先…

cookie机制

目录 为什么会有cookie?? cookie从哪里来的&#xff1f;&#xff1f; cookie到哪里去&#xff1f;&#xff1f; cookie有啥用&#xff1f;&#xff1f; session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…