在当今数据驱动的时代,数据库作为数据存储与管理的核心工具,其重要性不言而喻。MySQL 作为一款广泛应用的开源数据库,凭借其高性能、高可靠性和丰富的功能,深受开发者喜爱。本文作为 MySQL 系列博客的开篇,将带你深入了解 MySQL 的基础概念、数据类型、完整性约束以及表间关系。

一、MySQL 介绍

1.1 关系型数据库概述

关系型数据库是基于关系模型建立的数据库,以行和列的形式存储数据,通过表格之间的关联来表达数据之间的关系。常见的关系型数据库有 SQL Server、Oracle、DB2、MariaDB 等。以安卓系统中的 SQLite 为例,它是一款进程内数据库,常用于移动端应用的本地数据存储,轻量级且易于集成。

与关系型数据库相对的是非关系型数据库,例如键值(k-v)存储的 Nosql、Redis,以及列式数据库 HBase 等。非关系型数据库在处理海量非结构化或半结构化数据时表现出色,而关系型数据库则在处理结构化数据、保证数据的一致性和完整性方面具有优势。

1.2 MySQL 的独特之处

MySQL 属于 Oracle 旗下的开源数据库,它区别于其他关系型数据库的一个很大特点是支持插件式存储引擎。这意味着开发者可以根据应用场景的不同,选择最适合的存储引擎。例如,InnoDB 引擎支持事务处理、外键约束,适合对数据完整性要求较高的应用;MyISAM 引擎则以其高性能的查询和插入操作,适用于只读或读多写少的场景。

MySQL 采用 C/S(客户端 / 服务器)模型,在架构设计上,使用 I/O 复用结合可伸缩线程池(select + 线程池)的方式。由于数据库操作涉及磁盘 I/O,在这种场景下,select 模型已经能够满足需求,没必要使用 epoll。这种架构设计使得 MySQL 能够高效地处理大量客户端请求,保证系统的稳定性和性能。

1.3 MySQL 的安装(ubuntu)

参考:【MySQL数据库】Ubuntu下的mysql_ubuntu mysql-CSDN博客

二、MySQL 数据类型

数据库操作中,磁盘 I/O 往往是最先遇到的性能瓶颈。MySQL 的数据类型定义了数据的大小范围,合理选择数据类型不仅能降低表占用的磁盘空间,还能减少磁盘 I/O 次数,提高访问效率

2.1 整数类型

数据类型

字节

最小值(有符号)

最大值(有符号)

最小值(无符号)

最大值(无符号)

TINYINT

1

-128

127

0

255

SMALLINT

2

-32768

32767

0

65535

MEDIUMINT

3

-8388608

8388607

0

16777215

INT

4

-2147483648

2147483647

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

0

18446744073709551615

在定义整数类型时,需要注意一些细节。例如:

CREATE TABLE users(age INT(9) unsigned NOT NULL DEFAULT 0);

这里INT(9)中的9是数据显示时的宽度,和字符类型不同,数值型数据大小和数据类型强相关,并不会因为括号内的数字而改变占用的内存空间。

2.2 字符串类型

数据类型

描述

最大长度

CHAR(M)

固定长度字符串,M字节

255 个字符

VARCHAR(M)

可变长度字符串

65535 个字符(受限于行的最大长度)

TEXT

文本字符串

65535 个字符

MEDIUMTEXT

中等长度文本字符串

16777215 个字符

LONGTEXT

长文本字符串

4294967295 个字符

假设我们要创建一个存储用户昵称的表:

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL);

使用VARCHAR类型存储用户名,既能满足可变长度的需求,又能节省存储空间。

2.3 日期和时间类型

数据类型

描述

格式

DATE

日期值

YYYY-MM-DD

TIME

时间值或持续时间

HH:MM:SS

DATETIME

日期和时间组合

YYYY-MM-DD HH:MM:SS

TIMESTAMP

时间戳

YYYY-MM-DD HH:MM:SS

YEAR

年份值

YYYY 或 YY

例如,记录用户的注册时间:

CREATE TABLE user_registrations (id INT AUTO_INCREMENT PRIMARY KEY,registration_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

TIMESTAMP类型会自动记录插入数据时的时间,方便进行时间相关的统计和查询。

2.4 enum 和 set

ENUM类型用于定义一个字符串对象,该对象只能从预定义的列表中选取一个值;SET类型同样基于预定义的列表,但可以选取多个值。

CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,size ENUM('S', 'M', 'L', 'XL'),colors SET('red', 'green', 'blue'));

在插入数据时,size字段只能是'S'、'M'、'L'、'XL'中的一个,而colors字段可以是'red'、'green'、'blue'的任意组合。

三、完整性约束

完整性约束用于确保数据库中数据的准确性和一致性,在 MySQL 中,常见的完整性约束有以下几种:

3.1 主键约束(PRIMARY KEY)

主键是表中的一列或多列组合,用于唯一标识表中的每一行记录。一个表只能有一个主键,且主键值不能为 NULL,也不能重复。例如,创建一个存储学生信息的表:

CREATE TABLE students (student_id INT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,age INT);

这里student_id作为主键,能快速定位和区分每一位学生的记录。

3.2 自增键约束(AUTO_INCREMENT)

自增键是一种特殊的主键,通常为整数类型,在插入新记录时,其值会自动递增。一般用于生成唯一的标识。如:

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT);

每次向orders表插入新订单时,order_id都会自动生成一个唯一的递增数值。

3.3 唯一键约束(UNIQUE

唯一键约束保证表中指定列的值是唯一的,但可以有一个 NULL 值(如果允许 NULL)。例如,在用户表中,用户的邮箱地址应具有唯一性:

CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(100) UNIQUE,username VARCHAR(50) NOT NULL);

这样能避免不同用户使用相同的邮箱进行注册。

3.4 非空约束(NOT NULL

非空约束规定列中不允许出现 NULL 值。在定义表结构时,若某列数据必须存在,就可以使用非空约束。如:

CREATE TABLE employees (employee_id INT AUTO_INCREMENT PRIMARY KEY,employee_name VARCHAR(50) NOT NULL,department VARCHAR(50));

employee_name列必须有值,否则插入数据时会报错。

3.5 默认值约束(DEFAULT

默认值约束为列指定一个默认值,当插入数据时若未指定该列的值,就会使用默认值。例如,记录用户注册时间时,若不手动指定时间,就使用当前时间:

CREATE TABLE user_registrations (id INT AUTO_INCREMENT PRIMARY KEY,registration_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,user_id INT);

3.6 外键约束

外键用于建立表与表之间的关联关系,确保数据的一致性和完整性。比如,有orders表和customers表,orders表中的customer_id需要关联到customers表的主键customer_id:

CREATE TABLE customers (customer_id INT PRIMARY KEY,customer_name VARCHAR(50) NOT NULL);CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,order_date DATE,customer_id INT,FOREIGN KEY (customer_id) REFERENCES customers(customer_id));

通过外键约束,能保证orders表中的customer_id在customers表中存在,避免出现无效的关联数据。

但是由于数据库需要进行磁盘I/O操作,导致数据库往往是性能瓶颈所在,因此业务中逻辑相关操作往往交给业务层代码实现,所以外键约束并不常用。(下文中外键约束仅用于理解表间关系)

四、表与表之间的关系

在设计数据库时,表与表之间的关系建模是关键环节,直接影响数据的存储效率、查询性能以及数据完整性。常见的表间关系包括一对一、一对多和多对多。

(1) 一对一

一对一关系是指两张表中的记录通过特定字段形成一一对应的映射,通常用于将一张表中部分不常用或敏感字段拆分到另一张表,以减少主表冗余或满足安全性需求。

案例:以电商系统中用户信息表和用户扩展信息表为例。用户表存储基础登录信息(如用户名、密码),扩展表存储用户详细资料(如身份证号、收货地址)。

-- 用户基础信息表CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(128) NOT NULL);-- 用户扩展信息表CREATE TABLE user_extensions (extension_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT UNIQUE, -- 通过user_id建立一对一关联id_card VARCHAR(18),shipping_address TEXT,FOREIGN KEY (user_id) REFERENCES users(user_id));

关系实现:通过在user_extensions表中设置user_id字段作为外键,并添加UNIQUE约束,确保每个user_id仅对应一条扩展记录。当插入数据时,若user_extensions表中已存在某个user_id,则新记录插入失败,从而保证一对一关系的唯一性。

(2) 一对多

一对多关系是最常见的表间关系,指一张表(主表)的一条记录对应另一张表(从表)的多条记录。通常通过在从表中引入主表的主键作为外键实现关联。

案例:以学校管理系统中的班级表和学生表为例,一个班级包含多名学生。

-- 班级表(主表)CREATE TABLE classes (class_id INT AUTO_INCREMENT PRIMARY KEY,class_name VARCHAR(20) NOT NULL,teacher VARCHAR(50));-- 学生表(从表)CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,age INT,class_id INT, -- 引入班级表的主键作为外键FOREIGN KEY (class_id) REFERENCES classes(class_id));

关系实现:在students表中通过class_id字段关联classes表的class_id主键。插入学生记录时,class_id必须是classes表中已存在的值,确保数据一致性。例如,查询某个班级的所有学生时,可通过JOIN操作:

SELECT s.student_name, c.class_nameFROM students sJOIN classes c ON s.class_id = c.class_idWHERE c.class_name = '高三(1)班';
(3)多对多

多对多关系表示两张表中的多条记录可相互关联,由于数据库无法直接存储这种关系,需引入中间表(也称关联表)进行建模。中间表包含两张主表的主键字段,通过组合主键确保关系的唯一性。

案例:以图书管理系统中的书籍表和读者表为例,一本书可被多名读者借阅,一个读者可借阅多本书。

-- 书籍表CREATE TABLE books (book_id INT AUTO_INCREMENT PRIMARY KEY,book_title VARCHAR(100) NOT NULL,author VARCHAR(50));-- 读者表CREATE TABLE readers (reader_id INT AUTO_INCREMENT PRIMARY KEY,reader_name VARCHAR(50) NOT NULL,contact VARCHAR(100));-- 中间表(借阅记录表)CREATE TABLE borrow_records (book_id INT,reader_id INT,borrow_date DATE,return_date DATE,PRIMARY KEY (book_id, reader_id), -- 组合主键确保唯一性FOREIGN KEY (book_id) REFERENCES books(book_id),FOREIGN KEY (reader_id) REFERENCES readers(reader_id));

中间表设计要点

  1. 字段组成:包含关联的两张主表的主键字段(如book_id和reader_id),可按需添加其他属性(如借阅时间、归还时间)。
  2. 主键设置:使用组合主键(PRIMARY KEY (book_id, reader_id)),确保同一条书籍与读者的关联关系不会重复记录。
  3. 外键约束:通过外键关联主表主键,保证数据引用的完整性,例如删除书籍时,可通过外键级联操作同步删除相关借阅记录。

通过中间表,多对多关系被拆解为两个一对多关系,既保证数据的完整性,又能灵活实现复杂查询与业务逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考高项论文】信息系统项目的资源管理

摘要 本文围绕信息系统项目的资源管理展开论述。首先阐述了项目资源管理的基本过程,包括资源规划、估算、获取、配置、监控和释放等关键步骤,并给出资源分解结构示例。接着结合2024年参与管理的某信息系统项目实际情况,详细说明资源管理的具…

阿里云Ubuntu服务器上安装MySQL并配置远程连接

1. 安装MySQL 首先连接到你的Ubuntu服务器,然后执行: # 更新软件包列表 sudo apt update# 安装MySQL服务器 sudo apt install mysql-server# 启动MySQL服务 sudo systemctl start mysql# 设置MySQL开机自启 sudo systemctl enable mysql# 检查MySQL状态…

STM32HAL 旋转编码器教程

配置时钟编码模式读取方法: if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1) 0){count - __HAL_TIM_GET_COUNTER(&htim1);}else{count __HAL_TIM_GET_COUNTER(&htim1);}bsp_dtUInt32_show(count);__HAL_TIM_SET_COUNTER(&htim1, 0); 通过 __HAL_TIM…

激光束修复手机屏任意层不良区域,实现液晶线路激光修复原理

摘要 手机屏结构多层复合,任意层线路不良严重影响显示质量。激光束凭借高能量密度与可调控性,能够穿透不同介质精准作用于目标层。本文基于激光与多层材料相互作用机制,解析激光束对手机屏各层不良区域的修复原理,为全层液晶线路…

【软件开发】架构与架构师

文章目录 一、前言二、关于系统架构1. 保障用户访问速度2. 支持大规模并发请求3. 应对复杂业务逻辑4. 应对海量数据的存储与读写三、关于系统架构师四、关于安全架构1. 产品安全架构2. 安全体系架构五、关于安全架构师一、前言 在系统建设与技术架构实践不断推进的背景下,关于…

Blender速成班-基础篇2

视频教程:【第一章】基础操作_哔哩哔哩_bilibili 目录 编辑模式 1.1侧边属性 挤出选区——E 挤出方式选择——AltE ​编辑 内插面——I 倒角——CtrlB 环切——CtrlR 旋绕 本片继续基于视频教程介绍Blender的一些基础操作 勾选Cavity使物体边线更清晰 编…

对象进阶与扩展

目录 创建对象 Object.create() 原型 原型操作 原型污染 对象属性 属性特征 枚举属性 Object.keys() Object.getOwnPropertyNames() Object.getOwnPropertyDescriptor() O…

理解图像的随机噪声

图像灰度信息很难精确测量,一般情况下测量值总在真实值附近晃动,使用概率模型可以对该随机性建模,大致如下: 1 概率密度函数 1)随机变量 x 的概率密度函数 p(x) 定义为:当 趋近于 0 时,在区间 上…

华为云镜像仓库下载 selenium/standalone-chrome 镜像

你可以使用以下步骤从华为云镜像仓库下载 selenium/standalone-chrome 镜像&#xff1a; 1. 登录华为云镜像仓库&#xff08;如果需要认证&#xff09; bash sudo docker login -u <用户名> -p <密码> swr.cn-north-4.myhuaweicloud.com 如果没有华为云账号&…

Push-T, AloHa, Rlbench三个仿真环境信息

1.Push-T 很好兄弟&#xff0c;你问得很关键&#xff1a;你给我的三段代码其实是一套完整的推理录像 pipeline&#xff0c;它们之间既有独立功能&#xff0c;又有顺序依赖关系。我来帮你分段解释&#xff0c;每段是什么功能、三段之间怎么配合&#xff0c;让你彻底搞明白。 &a…

Linux信号机制:从入门到精通

嘿&#xff0c;小伙伴们&#xff01;今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心&#xff0c;虽然信号听起来有点高深&#xff0c;但我会用最通俗易懂的语言&#xff0c;配合清晰的图表&#xff0c;带你彻底搞懂这个概念&#xff01; 什么是信号…

Vue3项目引入高德地图【超详细教程】

前言 在 Vue 3 项目中集成高德地图&#xff08;AMap&#xff09;是一个常见的需求。本文将详细介绍如何在 Vue 3 项目中使用高德地图&#xff0c;包括安装配置、基本使用以及一些进阶功能的实现。 一、环境准备 1.1 vue3项目初始化 步骤 1&#xff1a;初始化项目 npm crea…

blender mcp安装(完全免费的ai建模)

1.最关键的一步&#xff0c;建议最早执行(就是安装uvx) mac系统执行 brew install uvwindows执行 powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 出现这一步就成功安装uvx了&#xff0c;因为mcp需要使用uvx 2.第二步骤 github地址: https://gith…

GIS开发入门教程与笔记分享

大家好&#xff0c;我是地信小学生&#xff0c;距离5月3日发布暂停更新以来&#xff0c;也一两个月啦&#xff0c;这期间也陆陆续续更新了点内容。 我自己写的笔记主要是以入门笔记为主&#xff0c;真正的内容并不多&#xff0c;包括&#xff1a;GIS基础、PostgreSQLPostGIS入门…

设计模式-代理模式、装饰者模式

代理模式 Proxy&#xff08;代理&#xff09;—对象结构型模式定义&#xff1a;给某一个对象提供一个代理对象&#xff0c;并由代理对象控制原有对象的引用。 代理模式的核心思想是&#xff1a;创建一个代理对象&#xff0c;代理对象在调用目标方法时&#xff0c;可以插入额外…

国产安路FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供5套TD工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产安路FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->GC0308摄像头输入Sensor之-->OV7725摄像头输入Sensor之--…

Windows商店中的简笔画学习应用

此应用包含动物、植物、人物、交通工具、卡通等类别超过1500张线条图片&#xff0c;支持图片临摹和图片填色&#xff0c;可以将绘图和填色结果保存成文件&#xff0c;也可以打开本地图片进行临摹和填色。 菜单说明 右侧绘图区上方菜单功能包括&#xff1a;打开文件&#xff1…

树莓派4B --ubundu20.04 机载电脑配置WIFI热点

不要用刷机过程配置WIFI账号&#xff0c;因为在那里配置的WIFI都是不受控的&#xff0c;会出很多问题。 1.安装网络 sudo apt-get install network-manager 2.将源码CLONE到本地 sudo git clone https://github.com/oblique/create_ap cd create_ap sudo make install 当你…

​​JETSON NANO B01​ 在AIOT 的领域的作用

低功耗边缘设备的理想选择 &#x1f449; ​​适合人群​​&#xff1a;精打细算、小厂搞智能监控的 ​​Jetson Nano B01​​&#xff08;4GB内存/0.47TOPS算力&#xff09;&#xff0c;JetBot (NVIDIA社区版) 机器人/自动驾驶项目​ ​​硬件​​&#xff1a;Jetson Nano B0…

Kioptrix Level2

靶机截图 收集信息 主机发现 打开靶机后&#xff0c;用kali探测靶机的 IP arp-scan-l 可以用nmap进行同网段扫描探测存活ip nmap -sP 10.4.7.0/24 端口扫描 命令过程 nmap -sT -sV -p- -O 10.4.7.220 -sT&#xff1a;TCP连接扫描 -sV&#xff1a;服务版本探测 -p-&#x…