1、数据模型:数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:
层次模型就是以“上下级”的层次关系来组织数据的一种方式,层次模型的数据结构看起来就像一颗树
网状模型把每个数据节点和其他很多节点都连接起来,它的数据结构看起来就像很多城市之间的路网:
关系模型把数据看作是一个二维表格,任何数据都可以通过行号+列号来唯一确定,它的数据模型看起来就是一个Excel表:
随着时间的推移和市场竞争,最终,基于关系模型的关系数据库获得了绝对市场份额。为什么关系数据库获得了最广泛的应用?因为相比层次模型和网状模型,关系模型理解和使用起来最简单。
上面的表中列举了最常用的数据类型。很多数据类型还有别名,例如,REAL又可以写成FLOAT(24)。还有一些不常用的数据类型,例如,TINYINT(范围在0~255)。各数据库厂商还会支持特定的数据类型,例如JSON。选择数据类型的时候,要根据业务规则选择合适的类型。通常来说,BIGINT能满足整数存储的需求,VARCHAR(N)能满足字符串存储的需求,这两种类型是使用最广泛的。
3、主流关系数据库:目前,主流的关系数据库主要分为以下几类:
4、什么是SQL?SQL是结构化查询语言的缩写,用来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,这样,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。
5、SQL语言定义了这么几种操作数据库的能力:
(1)DDL:Data Definition Language —— DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。
(2)DML:Data Manipulation Language —— DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。
(3)DQL:Data Query Language —— DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。
1、关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。
表的每一行称为记录(Record),记录是一个逻辑意义上的数据。
表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。
通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
和Excel表有所不同的是,关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。
2、主键:对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id。常见的可作为id字段的类型有:
(1)自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;比如:BIGINT NOT NULL AUTO_INCREMENT类型,就是自增整数类型。
(2)全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
3、联合主键:关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。
对于联合主键,允许一列有重复,只要不是所有主键列都重复即可。没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。
4、主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。可以使用多个列作为联合主键,但联合主键并不常用。
5、外键:在students表中,通过class_id的字段,可以把数据与另一张class表关联起来,这种列称为外键。
6、外键约束:外键并不是通过列名实现的,而是通过定义外键约束实现的:
其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。
通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。
7、由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。
要删除一个外键约束,也是通过ALTER TABLE实现的:
8、多对多关系:
通过一个表的外键关联到另一个表,我们可以定义出一对多关系。有些时候,还需要定义“多对多”关系。
多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系。teachers表:id、name;classes表:id、name;中间表teacher_class关联两个一对多关系:id、teacher_id、class_id;通过中间表teacher_class可知teachers到classes的关系。因此,通过中间表,我们就定义了一个“多对多”关系。
9、一对一:一对一关系是指,一个表的记录对应到另一个表的唯一一个记录。
10、一对一的意义:大表拆分以提高性能
有人会问,既然是一对一关系,那为啥不给students表增加一个mobile列,这样就能合二为一了?
如果业务允许,完全可以把两个表合为一个表。但是,有些时候,如果某个学生没有手机号,那么,contacts表就不存在对应的记录。实际上,一对一关系准确地说,是contacts表一对一对应students表。
还有一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能。例如,把一个大的用户表分拆为用户基本信息表user_info和用户详细信息表user_profiles,大部分时候,只需要查询user_info表,并不需要查询user_profiles表,这样就提高了查询速度。
11、索引:在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
12、如果要经常根据score列进行查询,就可以对score列创建索引:
使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:
13、索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。
14、可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:
通过UNIQUE关键字我们就添加了一个唯一索引。
16、也可以只对某一列添加一个唯一约束而不创建唯一索引:
这种情况下,name列没有索引,但仍然具有唯一性保证。
17、无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。
这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。
18、通过对数据库表创建索引,可以提高查询速度。通过创建唯一索引,可以保证某一列的值具有唯一性。数据库索引对于用户和应用程序来说都是透明的。
1、使用 <> 可以判断不相等,如 score <> 80、name <> 'abc'
2、使用LIMIT <M> OFFSET <N>可以对结果集进行分页,每次查询返回结果集的一部分;分页查询需要先确定每页的数量和当前页数,然后确定LIMIT和OFFSET的值。
分页查询的关键在于,首先要确定每页需要显示的结果数量pageSize,然后根据当前页的索引pageIndex(从1开始),确定LIMIT和OFFSET应该设定的值:
这样就能正确查询出第N页的记录集。
OFFSET超过了查询的最大数量并不会报错,而是得到一个空的结果集。
OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0。在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。
3、连接查询:JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;
INNER JOIN只返回同时存在于两张表的行数据。
RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。
LEFT OUTER JOIN则返回左表都存在的行。
FULL OUTER JOIN,它会把两张表的所有记录全部选择出来,并且,自动把对方不存在的列填充为NULL
1、需要特别注意的是:update 和 delete 时,会更新和删除所有的数据,所以在执行UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。
2、插入或替换:如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。
此时,可以使用REPLACE语句,这样就不必先查询,再决定是否先删除再插入:
若id=1的记录不存在,REPLACE语句将插入新记录,否则,当前id=1的记录将被删除,然后再插入新记录。
3、插入或更新:如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录。
此时,可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句:
若id=1的记录不存在,INSERT语句将插入新记录,否则,当前id=1的记录将被更新,更新的字段由UPDATE指定。
4、插入或忽略:如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略。
此时,可以使用INSERT IGNORE INTO ...语句:
若id=1的记录不存在,INSERT语句将插入新记录,否则,不执行任何操作。
5、快照:如果想要对一个表进行快照,即复制一份当前表的数据到一个新表,可以结合CREATE TABLE和SELECT:
新创建的表结构和SELECT使用的表结构完全一致。
6、写入查询结果集:如果查询结果集需要写入到表中,可以结合INSERT和SELECT,将SELECT语句的结果集直接插入到指定表中。
7、强制使用指定索引:在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。
但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用FORCE INDEX强制查询使用指定的索引。
1、在执行SQL语句的时候,某些业务要求,一系列操作必须全部执行,而不能仅执行一部分。例如,一个转账操作:
这两条SQL语句必须全部执行,或者,由于某些原因,如果第一条语句成功,第二条语句失败,就必须全部撤销。
这种把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL一样,不会对数据库数据有任何改动。
2、数据库事务具有ACID这4个特性:
3、对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。
4、要手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务,例如,把上述的转账操作作为一个显式事务:
很显然多条SQL语句要想作为一个事务执行,就必须使用显式事务。
COMMIT是指提交事务,即试图把事务内的所有SQL所做的修改永久保存。如果COMMIT语句执行失败了,整个事务也会失败。
5、有些时候,我们希望主动让事务失败,这时,可以用ROLLBACK回滚事务,整个事务会失败:
数据库事务是由数据库系统保证的,我们只需要根据业务逻辑使用它就可以。
6、隔离级别
对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。
数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。
SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:
7、Read Uncommitted是隔离级别最低的一种事务级别。
在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。
8、在Read Committed隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。
不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
9、在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。
幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。
10、Serializable是最严格的隔离级别。
在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
虽然Serializable隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。
11、默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用InnoDB,默认的隔离级别是Repeatable Read。
概述项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:1.一对多(多对一)2.多对多3.一对一一、一对多需求:根据页面原型及需求文档,完成部门(一)及员工(多)模块的表结构设计一对多关系的实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。现在我们插入数据分析insert i
一、前言Spring Boot 是一个基于 Spring 框架的开源 Java 应用程序开发框架,旨在简化配置并加速开发过程。JPA(Java Persistence API)是 Java EE 规范的一部分,它提供了管理 Java 对象与数据库表之间关系的机制。JPA 使得开发人员可以通过对象关系映射(ORM)技术,简化数据操作,避免了繁琐的 JDBC 编程。在 Spring Boot 中,我们
本文将带你从零开始,手把手实现 MyBatis 中常见的三种关系映射,并结合 Spring Boot 给出完整示例,助你轻松应对面试与实战!
11. 多表间的关系-一对多-多对多-一对一-外键约束1. 表关系概述 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,用户和订单、订单和商品、学生和课程等等。那么...
-----随堂笔记-----一对一的表关系实现一对一主要是对关联的字段进行唯一约束CREATE TABLE `woman` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `hid` int(10) unsigned DEFAULT NULL, PRIMARY K...
可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的。在一个关
MySQL数据库表关系详解(一对多、一对一、多对多)
gorm 关系一对一,一对多,多对多查询 gorm v2版本 Belongs To mysql表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL DEFAULT '', `
一对一:A中的一个实体至多与B中的一个实体相关联,且B中的一个实体也至多与A中一个实体相关联。一对多:A中的一个实体可以与B中的任意数目(零个或多个)实体相关联,而B中一个实体至多与A中一个实体相关联。
目录目录Basic Relationship PatternsOne To ManyOne To OneMany To ManyBasic Relationship Patterns基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中:fr
1、定义模型 示例:学生和桌子的一对一关系:每个学生需要对应一个桌位信息,桌位信息不用包含学生
1、一对多:比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知
# MongoDB数据库设计:一对一、一对多与多对多关系MongoDB是一种面向文档的NoSQL数据库,与传统的关系型数据库相比,它的数据结构更灵活,不再局限于表格形式。MongoDB的数据模型为开发者在设计数据库时提供了多种选择,今天我们将讨论MongoDB中的一对一、一对多和多对多关系模型,并附有代码示例,以帮助大家更好地理解这些设计理念。## 一、基础概念在关系型数据库中,我们习
我们有四张表:person_publisher person_book person_author person_author_book 接下来分别从正向查询(子表-->主表)和反向查询(主表-->子表)进行。 1.一对一 正向查询:查询book中id=2(python)对应的出版社 反向查询:查询
一、修改表-添加外键约束外键约束:foreign key 。给product中的这个cno添加一个外键约束 alter table product add foreign key(cno) references category(cid); 。从分类表中,删除分类为5信息 。delete from category where cid=5;
<0> 多表关系概述 实际开发中,一个项目通常需要很多张表才能完成。 例如:一个商城项目就需要分类表(category)、 商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们一起 学习一下多表关系设计方面的知识 表与表之间的三种关系 一对多关系: ...
css3 学习笔记、css3、样式、前端样式
简介:V4L2(Video for Linux Two)是Linux内核中用于支持摄像头、电视卡等视频设备的核心接口,为用户空间应用程序提供标准的视频捕获、输出和图像处理能力。本文详细介绍了V4L2架构的关键组件,包括设备驱动、内核框架、用户空间系统调用、缓冲区管理机制、流式传输模式、控制接口及多设备支持,并探讨了其与虚拟设备(VDev)的交互方式。通过理解V4L2的整体结构与数据流机制,开发
一、NumPy库简介 NumPy 是 Numerical Python 的简称,它是 Python 数值计算中最重要的基础包之一。大多数提供科学计算的包都用 NumPy 数组对象作为数据交换的通用标准接口。NumPy 本身并没有提供建模和科学计算功能。NumPy 的部分内容和功能如下: ndarra ...
大致上,数字文件有三种类型:用于打印的、用于建模的和用于二维绘图的。为了生产实体零件,3D打印机需要特定的文件类型。被称为“网格模型”,3D打印中最常见的文件类型称为STereoLithography,简称STL。可以免费查看编辑转换3D格式 用于打印的3D文件 。STL:STL(STereoL ...