首页数据库sql数据库必背知识(数据库相关知识)

sql数据库必背知识(数据库相关知识)

编程之家2026-05-14630次浏览

其实sql数据库必背知识的问题并不复杂,但是又很多的朋友都不太了解数据库相关知识,因此呢,今天小编就来为大家分享sql数据库必背知识的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

sql数据库必背知识(数据库相关知识)

计算机三级数据库必背知识点

计算机三级数据库必背知识点如下:

一、数据库基本概念与生命周期需掌握数据库核心概念及数据库应用系统生命周期,包括项目规划、需求分析、系统设计、实现与部署、运行与维护五个阶段。系统设计分为概念设计(E-R图绘制)、逻辑设计(E-R图转关系模式、规范化处理)和物理设计(文件组织形式、索引设计策略)三个步骤,是构建数据库的基础框架。

二、SQL语言与数据操作重点掌握复杂查询实现,如集合运算(UNION/INTERSECT/EXCEPT)、子查询(嵌套查询、相关子查询)及扩展功能(窗口函数、递归查询)。需理解INSERTED表和DELETED表的作用,二者分别存储INSERT/UPDATE/DELETE操作影响的新值副本和旧值副本,是触发器实现数据变更跟踪的关键。

三、数据库对象与编程技术需掌握分区表(水平/垂直分区)、索引(B树/哈希索引)的创建方法,理解存储过程(预编译SQL块)、用户定义函数(标量/表值函数)、触发器(事件驱动自动执行)和游标(逐行处理结果集)的核心概念及定义语法,这些对象是数据库功能扩展的核心工具。

四、数据库管理与维护安全管理需掌握权限控制(GRANT/REVOKE语句);性能优化需监控数据缓冲区命中率、索引使用率等指标,通过调整内存参数、优化SQL语句提升性能;故障管理需掌握备份与恢复技术(完全/差异备份、时间点恢复);维护内容包括数据转储、安全性审计、性能检测与改善、数据重组与重构。

五、数据库性能与优化需理解锁与等待(行锁/表锁)、回滚段使用情况等监控指标,掌握事务隔离级别设置(READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE)和索引调整(添加/删除索引、索引选择性分析)等优化方法。

sql数据库必背知识(数据库相关知识)

六、高级数据库技术需理解数据仓库的四大特征(面向主题、集成、稳定、反映历史变化)及数据挖掘基本流程,了解分布式数据库(数据分片与透明访问)、XML数据库(半结构化数据存储)、并行数据库(多处理器协同处理)和空间数据库(地理信息存储)等新技术架构。

七、数据模型与独立性掌握物理独立性(通过外模式/模式映像实现)和逻辑独立性(通过模式/内模式映像实现)的概念,理解关系模型中通过外键约束实现表间关联的机制,这是保障数据结构灵活性的关键。

八、数据库管理员(DBA)职责需明确DBA的核心任务,包括数据库结构规划、存储策略制定、安全性要求定义、运行状态监控及性能改进,是数据库系统稳定运行的保障角色。

九、考试重点章节与题型分布第三章数据库结构设计是应用题核心,重点考察E-R图绘制、关系模式转换及范式判断(1NF-BCNF);第二章需求分析需掌握数据字典和数据流图概念;第一章开发方法需区分生命周期阶段任务及结构化/面向对象开发方法的差异。考试形式为上机操作,满分100分,包含单项选择题(40分)、填空题(30分)、设计与应用题(30分),建议以2025年版《全国计算机等级考试三级教程——数据库技术》为复习依据。

急!求个数据库课程的设计!!

《数据库原理及应用》课程设计

数据库原理课程设计任务书

sql数据库必背知识(数据库相关知识)

一、目的

1.掌握计算机管理信息系统设计的一般方法,主要包括系统分析、系统设计的组织和实施。

2.关系型数据库管理系统的编程技术,并能独立完成一般小系统的程序设计、调试运行等工作。

3.培养把所学知识运用到具体对象,并能求出解决方案的能力。

二、任务(任选其一)

A.运用关系型数据库管理系统,实现本院图书馆管理信息系统。具体要求如下:

—图书、资料的登记、注销和查询。

—借书证管理,包括申请、注销借书证,查询借书证持有人等。

—借还图书、资料的登记、超期处理,超期拒借等。

—图书、资料查询,借、还图书和资料情况查询。

—图书、资料借阅情况的统计分析,拒此作为图书馆图书、资料订够的依据之一。(本项不作为基本要求)

B.运用关系型数据库管理系统,实现服务电话管理系统

向客户现场派技术人员的服务公司可以用服务电话管理系统跟踪客户、员工、工作订单、发票、付款等等。

要求:

数据库要存储以下信息:

—客户信息

—客户工需单信息

—完成工需单所需人工

—完成工需单所需部件

—部件信息

—付款信息

—雇员信息

完成的功能:

—输入/查看客户工需单信息

—输入/查看部件、雇员等其它信息

—付款

—打印发票等

三、结果形式

1.设计报告:含E-R图、数据字典、关系模式、关系实例、查询描述、关系代数、SQL实现的查询语言及查询结果。

2.上机实现。

四、考核

1.课程设计态度(20分)。

2.递交的书面材料(40分)。

3.上机运行情况(40分)

目录

1.问题描述 2

1.1背景 2

1.2数据需求 2

1.3事物需求 3

1.4关系模式 3

2.方案图表设计 3

2.1 E-R图 3

2.2数据流程图 8

2.3数据字典 9

2.4关系图: 11

3.数据库源代码 12

3.1数据库建立 12

3.2数据初始化 14

4.结果数据处理 17

4.1单表查询 17

4.2超期处理 19

4.3还书操作 20

4.4借书操作 22

4.5书籍状态 24

4.6读者状态 24

5.结束语 26

5.1课程设计心得 26

1.问题描述

1.1背景

随着图书馆规模的不断扩大,图书数量也相应的增加,有关图书的各种信息量也成倍增加,面对着庞大的信息量,传统的人工方式管理会导致图书馆管理上的混乱,人力与物力过多浪费,图书馆管理费用的增加,从而使图书馆的负担过重,影响整个图书馆的运作和控制管理,因此,必须制定一套合理、有效,规范和实用的图书管理系统,对图书资料进行集中统一的管理。

另一方面,IT产业和Internet获得了飞速发展,计算机应用已渗透到了各个领域,引起信息管理的革命,实现了信息的自动化处理,提高了处理的及时性和正确性。

提高图书管理工作效率,作到信息的规范管理,科学统计和快速查询,让图书馆更好的为学校,社会服务。

1.2数据需求

图书馆管理信息系统需要完成功能主要有:

1.读者基本信息的输入,包括借书证编号、读者姓名、读者性别。

2.读者基本信息的查询、修改,包括读者借书证编号、读者姓名、读者性别等。

3.书籍类别标准的制定、类别信息的输入,包括类别编号、类别名称。

4.书籍类别信息的查询、修改,包括类别编号、类别名称。

5.书籍库存信息的输入,包括书籍编号、书籍名称、书籍类别、作者姓名、出版社名称、出版日期、登记日期。

6.书籍库存信息的查询,修改,包括书籍编号、书籍名称、书籍类别、作者姓名、出版社名称、出版日期登记日期等。

7.借书信息的输入,包括读者借书证编号、书籍编号、借书日期。

8.借书信息的查询、修改,包括借书证编号、读者编号、读者姓名、书籍编号、书籍名称、借书日期等。

9.还书信息的输入,包括借书证编号、书籍编号、还书日期。

10.还书信息的查询和修改,包括还书读者借书证编号、读者姓名、书籍编号、书籍名称、借书日期、还书日期等。

11.超期还书罚款输入,还书超出期限包括超出期限还书的读者借书证号,书籍编号,罚款金额。

12.超期还书罚款查询,删除,包括读者借书证编号、读者姓名、书籍编号、书籍名称,罚款金额等

1.3事物需求

(1)在读者信息管理部分,要求:

a.可以查询读者信息。

b.可以对读者信息进行添加及删除的操作。

(2)在书籍信息管理部分,要求:

a.可以浏览书籍信息,要求:

b.可以对书籍信息进行维护,包括添加及删除的操作。

(3)在借阅信息管理部分,要求:。

a.可以浏览借阅信息。

b.可以对借阅信息进行维护操作。

(4)在归还信息管理部分,要求:

a.可以浏览归还信息

b.对归还信息可修改维护操作

(5)在管理者信息管理部分,要求:

a.显示当前数据库中管理者情况。

b.对管理者信息维护操作。

(6)在罚款信息管理部分,要求:

a.可以浏览罚款信息

b.对罚款信息可以更新

1.4关系模式

(一)书籍类别(种类编号,种类名称)

(二)读者(借书证编号,读者姓名,读者性别,读者种类,登记时期)

(三)书籍(书籍编号,书籍名称,书籍类别,书记作者,出版社名称,出版日期,登记日期)

(四)借阅(借书证编号,书籍编号,读者借书时间)

(五)还书(借书证编号,书籍编号,读者还书时间)

(六)罚款(借书证编号,读者姓名,借书证编号,书籍编号,读者借书时间)

以上通过关系代数方法的进行运算得到所需要的结果,在实验结果中可以看到。

2.方案图表设计

2.1 E-R图

根据1)所要实现的功能设计,可能建立它们之间的关系,进而实现逻辑结构功能。

图书管理信息系统可以划分的实体有:书籍类别信息实体、读者信息实体、书籍信息实体、借阅记录信息实体,归还记录信息实体。用E-R图一一描述这些实体。

2.1.1类别实体E-R图:

图2-1类别实体E-R图

2.1.2读者信息实体E-R图:

图2-2读者信息实体E-R图

2.1.3信息实体E-R图:

图2-3信息实体E-R图

2.1.4.记录信息实体E-R图:

图2-4记录信息实体E-R图

2.1.5记录信息实体E-R图:

图2-5记录信息实体E-R图

2.1.6罚款信息实体E-R图:

图2-6罚款信息实体E-R图

2.1.6总的信息实体E-R图:

图2-7总的信息实体E-R图

2.2数据流程图

D5

归还信息录入基本信息录入

D2

D1

基本信息录入基本信息录入

D3

D4

借阅信息录入

读者信息返回书籍信息返回

图2-7系统的数据流程图

2.3数据字典

表2-1 book_sytle书籍类别信息表

表中列名数据类型可否为空说明

bookstyleno varchar not null(主键)种类编号

bookstyle Varchar not null种类名称

表2-2 system_readers读者信息表格

表中列名数据类型可否为空说明

readerid varchar not null(主键)读者借书证号

readername varchar not null读者姓名

readersex varchar not null读者性别

readertype varchar null读者种类

regdate datetime null登记日期

表2-3 system_book书籍信息表

表中列名数据类型可否为空说明

bookid Varchar Not null(主键)书籍编号

bookname Varchar Not null书籍名称

bookstyle Varchar Not null书籍类别

bookauthor Varchar Not null书籍作者

bookpub Varchar Null出版社名称

bookpubdate Datetime Null出版日期

bookindate Datetime Null登记日期

isborrowed Varchar Not Null是否被借出

表2-4 borrow_record借阅记录信息表

表中列名数据类型可否为空说明

readerid Varchar Not null(外主键)读者借阅证编号

bookid Varchar Not null(外主键)书籍编号

borrowdate Varchar Not null读者借书时间

表2-5 return_record借阅记录信息表

表中列名数据类型可否为空说明

readername Varchar Not null(外主键)读者借阅证编号

readerid Varchar Not null(外主键)书籍编号

returndate datetime Not null读者还书时间

表2-6 reader_fee罚款记录信息表

readerid varchar Not null读者借书证编号

readername varchar Not null读者姓名

bookid varchar Not null(外主键)书籍编号

bookname varchar Not null书籍名称

bookfee varchar Not Null罚款金额

borrowdate datetime Not Null借阅时间

2.4关系图:

图2-8数据库存表关系图

3.数据库源代码

3.1数据库建立

3.1.1创建数据库

USE master

GO

CREATE DATABASE librarysystem

ON

( NAME= librarysystem,

FILENAME='d:\librarysystem.mdf',

SIZE= 10,

MAXSIZE= 50,

FILEGROWTH= 5)

LOG ON

( NAME='library',

FILENAME='d:\librarysystem.ldf',

SIZE= 5MB,

MAXSIZE= 25MB,

FILEGROWTH= 5MB)

GO

3.1.2书本类别表建立

create table book_style

(

bookstyleno varchar(30) primary key,

bookstyle varchar(30)

)

3.1.3创建书库表

create table system_books

(

bookid varchar(20) primary key,

bookname varchar(30) Not null,

bookstyleno varchar(30) Not null,

bookauthor varchar(30),

bookpub varchar(30),

bookpubdate datetime,

bookindate datetime,

isborrowed varchar(2),

foreign key(bookstyleno) references book_style(bookstyleno),

)

3.1.4借书证表建立

create table system_readers

( readerid varchar(9)primary key,

readername varchar(9)not null,

readersex varchar(2) not null,

readertype varchar(10),

regdate datetime

)

3.1.5借书记录表建立

create table borrow_record

( bookid varchar(20) primary key,

readerid varchar(9),

borrowdate datetime,

foreign key(bookid) references system_books(bookid),

foreign key(readerid) references system_readers(readerid),

)

3.1.6还书记录表建立

create table return_record

( bookid varchar(20) primary key,

readerid varchar(9),

returndate datetime,

foreign key(bookid) references system_books(bookid),

foreign key(readerid) references system_readers(readerid)

)

3.1.7罚款单表建立*/

create table reader_fee

( readerid varchar(9)not null,

readername varchar(9)not null,

bookid varchar(20) primary key,

bookname varchar(30) Not null,

bookfee varchar(30),

borrowdate datetime,

foreign key(bookid) references system_books(bookid),

foreign key(readerid) references system_readers(readerid)

)

3.2数据初始化

3.2.1将书籍类别加入表book_style中

insert into book_style(bookstyleno,bookstyle)values('1','人文艺术类')

insert into book_style(bookstyleno,bookstyle)values('2','自然科学类')

insert into book_style(bookstyleno,bookstyle)values('3','社会科学类')

insert into book_style(bookstyleno,bookstyle)values('4','图片艺术类')

insert into book_style(bookstyleno,bookstyle)values('5','政治经济类')

insert into book_style(bookstyleno,bookstyle)values('6','工程技术类')

insert into book_style(bookstyleno,bookstyle)values('7','语言技能类')

3.2.2将已有的图书加入system_books表中(定义相同的作者出版社的书本编号不一样)

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed)

values('00125415152','计算机组成原理','6','王爱英','清华大学出版社','2001-01-03','2003-11-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed)

values('00125415153','计算机组成原理','6','王爱英','清华大学出版社','2001-01-03','2003-11-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('00456456','数据库原理','6','萨师煊','高等教育出版社','2007-07-02','2007-09-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub,bookpubdate, bookindate, isborrowed)

values('12215121','C程序设计','6','谭浩强','清华大学出版社','2002-04-02','2004-03-14','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('9787308020558','计算机体系结构','6','石教英','浙江大学出版社','2004-10-03','2006-11-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('45456141414','数据结构(C语言版)','6','吴伟民,严蔚敏','清华大学出版社','2002-06-28','2004-01-21','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('5455515','中华历史5000年','1','吴强','北京大学出版社','2005-04-03','2006-05-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('015115','古代埃及','3','赵文华','北京大学出版社','2001-02-02','2002-09-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('1514514','日本文化','1','吴小鹏','北京大学出版社','2002-04-02','2004-03-14','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('15154656','微观经济学','5','李小刚','北京大学出版社','2000-10-03','2001-11-15','1');

insert

into system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('5658','影视文学','4','苏庆东','北京大学出版社','1999-02-28','2000-01-21','1');

insert into

system_books(bookid,bookname, bookstyleno,bookauthor,bookpub, bookpubdate,bookindate, isborrowed)

values('565800020','探索宇宙奥秘','2','苏庆东','北京大学出版社','1999-02-28','2000-01-21','1');

3.2.3将已有图书证的读者加入system_readers表中*/

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('X05620207','陈远鹏','男','学生','2005-9-23 14:23:56')

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('X05620206','陈特','男','学生','2005-09-30 13:24:54.623')

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('X05620204','赵铭静','女','学生','2005-09-27 11:24:54.123')

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('X05620202','潘虹','女','学生','2005-09-30 13:24:54.473')

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('008415','蒋伟','男','教师','2004-04-30 09:24:54.478')

insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('001456','李叶风','女','教师','2004-04-30 09:24:54.478')

3.2.4添加已借书读者的记录,同时将在已借出的借阅标记置0*/

insert into borrow_record(bookid,readerid,borrowdate)

values('00125415152','X05620202','2007-09-27 11:24:54.123')

update system_books

set isborrowed=0

where bookid='00125415152'

insert into borrow_record(bookid,readerid,borrowdate)

values('00125415153','X05620206','2007-12-27 08:26:51.452')

update system_books

set isborrowed=0

where bookid='00125415153' and isborrowed='1'

insert into borrow_record(bookid,readerid,borrowdate)

values('5455515','X05620207','2007-12-27 08:26:51.452')

update system_books

set isborrowed=0

where bookid='5455515' and isborrowed='1'

insert into borrow_record(bookid,readerid,borrowdate)

values('015115','X05620204','2007-10-21 12:11:51.452')

update system_books

set isborrowed=0

where bookid='015115' and isborrowed='1'

insert into borrow_record(bookid,readerid,borrowdate)

values('15154656','001456','2007-12-28 14:11:51.312')

update system_books

set isborrowed=0

where bookid='15154656' and isborrowed='1'

insert into borrow_record(bookid,readerid,borrowdate)

values('565800020','008415','2007-08-28 15:11:31.512')

update system_books

set isborrowed=0

where bookid='565800020' and isborrowed='1'

4.结果数据处理

4.1单表查询

4.1.1表book_style中查询演示:

图4-1表book_style中内容

4.1.2表system_books中查询演示:

图4-2表system_books中内容

4.1.3将已有图书证的读者加入system_readers表中结果查询:

图4-3表system_readers中内容

4.1.4借书纪录表borrow_record结果查询:

图4-4表borrow_record中内容

4.2超期处理

4.2.1现在对已有借书证的读者进行查询借书是否超期(这里归定30天):

说明:当前的getdate()以日期为2008年1月6日计算

图4-4选出借出超过30天的读者

4.2.2同时也可以用语句超过天数的读者进行罚款,加入到罚款单里面,一天以0.3元扣除计算:

SQL语言:

insert into reader_fee(readerid,readername,bookid,bookname,bookfee,borrowdate)

select system_readers.readerid读者借书证编号,readername读者姓名,

system_books.bookid书籍编号,bookname书名,

0.3*(Datediff(day,convert(smalldatetime,borrowdate),getdate())-30)超过时间天数,

borrowdate借书时间

from borrow_record,system_readers,system_books

where system_readers.readerid=borrow_record.readerid

and system_books.bookid=borrow_record.bookid

and Datediff(day,convert(smalldatetime,borrowdate),getdate())>=30

(所影响的行数为 3行)

select readerid书读者借书证编号,readername读者姓名,

bookid书籍编号,bookfee超期罚款

from reader_fee

形成各本书对应的罚款金额,按0.3元每天算

图4-5查看罚款单

4.3还书操作

4.3.1现在对某一读者进行还书操作:

1.首先还书要在还书纪录中添加一条还书纪录

2.其次删除相应书本的借阅纪录

3.最后在书库中标记该本书为1,表示归还了未借,可供其他读者借阅

说明:学号为X05620207姓名为陈远鹏借阅的565800020书籍编号进行归还。

SQL语言:

insert into return_record(bookid,readerid,returndate)

select bookid,readerid,getdate()

from borrow_record

where bookid='565800020'

(所影响的行数为 1行)

delete

from borrow_record

where bookid='565800020'

(所影响的行数为 1行)

update system_books

set isborrowed=1

where bookid='565800020'

(所影响的行数为 1行)

三个表的结果如图:

图4-6增加了565800020纪录

图4-7 565800020这本书在借书纪录里没有了

图4-8标记设为了‘1’

说明:这本书重新回到未被借出标记为1(注,相同的书其编号是不同的)

其结果为还书成功,相应的各表都有变化,对于罚款单通过借阅记录表borrow_record中更新。

4.4借书操作

4.4.1查询未被借出的书本:

图4-9

4.4.2查询已被借出的书本:

图4-10

4.4.3申请借书证:

SQL语言:

Insert into system_readers(readerid,readername,readersex,readertype,regdate)

values('X05620211','小华','男','学生',getdate())

图4-11

说明:查询相应的纪录增加了小华这样一个读者的借书证纪录:

4.4.4注销借书证:

说明:

1.在注销之前执行所有的还书过程,就是上面写到的所述SQL语句,然后执行

delete from system_readers where readerid=' X05620211',

2.小华借书证纪录就被删除了,同时要删除和小华归还纪录的内容

delete from return_record where readerid=' X05620211',

4.4.5查询所有书所对应的类别:

图4-12

4.5书籍状态

4.5.1查询所有工技术类的书:

图4-13

4.5.2查询清华大学出版社出版的书:

图4-14

4.6读者状态

4.6.1查询什么人借了什么书:

SQL语言:

select readername读者姓名,bookname书籍名称

from borrow_record,system_books,system_readers

where system_readers.readerid=borrow_record.readerid

and system_books.bookid=borrow_record.bookid

图4-15

4.6.2指定潘虹借了什么书:

SQL语言:

select readername读者姓名,bookname书籍名称

from borrow_record,system_books,system_readers

where system_readers.readerid=borrow_record.readerid

and system_books.bookid=borrow_record.bookid

and readername='潘虹'

图4-16

5.结束语

5.1课程设计心得

通过此次数据库的课程设计,真正达到了学与用的结合,增强了对数据库方面应用的理解,对自己今后参与开发数据库系统积累了不少经验,在实验过程中,从建立数据开始,对灵据库设计理念及思想上有更高的认识,从需求分析,到概念设计和逻辑设计,E-R图的表示,数据字典的创建,懂得了不少有关数据库开发过程中的知识,在实验中建表,及其关系模式,关系代数的建立及理解,将SQL语的查询语句用得淋漓尽致,增强了自己在数据库中应用SQL语言的灵活性,其中包括,插入、删除、修改、查询,牵涉表和表之间的联系,主建与外主键的定义,约束项的设置,使逻辑更严密,在学习过程中,我也能过上网查了不少资料,也看了一些别人设计的图书馆管理信息系统的设计报告,学以致用,自我创新,独立完成了这份自己的报告,从中在学到用,从用又到学,不断修改,系统更新。虽然不能达到完善系统,但也做到了尽善尽美,加强理论学习对完善系统会有很多帮助,不管怎么说,对这次做的课程设计自己觉得还算满意。

学数据库以后可以做什么

只会写代码的是码农;

学好数据库,基本能混口饭吃

;在此基础上再学好操作系统和计算机网络

,就能当一个不错的程序员。如果能再把离散数学、数字电路、体系结构、数据结构/算法、编译原理学通透,再加上丰富的实践经验与领域特定知识,就能算是一个优秀的工程师了。计算机

其实就是存储/IO/CPU三大件;而计算

说穿了就是两个东西:数据与算法(状态与转移函数)

。常见的软件应用,除了各种模拟仿真、模型训练、视频游戏这些属于计算密集型应用

外,绝大多数都属于数据密集型应用

。从最抽象的意义上讲,这些应用干的事儿就是把数据拿进来,存进数据库,需要的时候再拿出来。抽象

是应对复杂度的最强武器。操作系统提供了对存储的基本抽象:内存寻址空间与磁盘逻辑块号。文件系统在此基础上提供了文件名到地址空间的KV存储抽象。而数据库则在其基础上提供了对应用通用存储需求的高级抽象

。互联网应用大多属于

数据密集型应用

,对于真实世界的数据密集型应用而言,除非你准备从基础组件的轮子造起,不然根本没那么多机会去摆弄花哨的数据结构和算法。甚至写代码的本事可能也没那么重要:可能只会有那么一两个AdHoc算法需要在应用层实现,大部分需求都有现成的轮子可以使用,主要的创造性工作往往在数据模型与数据流设计上。实际生产中,数据表就是数据结构,索引与查询就是算法

。而应用代码往往扮演的是胶水

的角色,处理IO与业务逻辑,其他大部分工作都是在数据系统之间搬运数据

。在最宽泛的意义上,

有状态的地方就有数据库

。它无所不在,网站的背后、应用的内部,单机软件,区块链里,甚至在离数据库最远的Web浏览器中,也逐渐出现了其雏形:各类状态管理框架与本地存储。“数据库”可以简单地只是内存中的哈希表/磁盘上的日志,也可以复杂到由多种数据系统集成而来。关系型数据库只是数据系统的冰山一角

(或者说冰山之巅),实际上存在着各种各样的数据系统组件:数据库

:存储数据,以便自己或其他应用程序之后能再次找到(PostgreSQL,MySQL,Oracle)缓存

:记住开销昂贵操作的结果,加快读取速度(Redis,Memcached)搜索索引

:允许用户按关键字搜索数据,或以各种方式对数据进行过滤(ElasticSearch)流处理

:向其他进程发送消息,进行异步处理(Kafka,Flink,Storm)批处理

:定期处理累积的大批量数据(Hadoop)架构师最重要的能力之一,就是了解这些组件的性能特点与应用场景,能够灵活地权衡取舍、集成拼接这些数据系统。

绝大多数工程师都不会去从零开始编写存储引擎,因为在开发应用时,数据库已经是足够完美的工具了。关系型数据库则是目前所有数据系统中使用最广泛的组件,可以说是程序员吃饭的主要家伙,重要性不言而喻。对玩具应用而言,使用内存变量与文件来保存状态也许已经绰绰有余了。但随着系统的增长,我们会遇到越来越多的挑战:软硬件故障把数据搞成一团浆糊(可靠性);状态太多而内存太小放不下(可伸缩性);并发访问控制导致代码复杂度发生爆炸(可维护性),诸如此类。这些问题相当棘手,却又相当普遍,数据库就是用来解决这些问题的。

分拆

是架构演化的重要方法论,数据库将状态管理

的职能从应用程序中分拆出来,即所谓的“状态与计算相分离”。数据库将程序员从重复造轮子的泥潭中解救出来,极大地解放了生产力。每个系统都服务于一个目的,解决一类问题。

问题比方法更重要

。但现实很遗憾,以大多数学生,甚至相当一部分公司能接触到的现实问题而言,拿几个文件甚至在内存里放着估计都能应付大多数场景了(需求简单到低级抽象就可以Handle)。没什么机会接触到数据库真正要解决的问题,也就难有真正使用与学习数据库的驱动力,更别提数据库原理了

。所以我也理解当前这种填鸭教学现状的苦衷:工作之后很难有这么大把的完整时间来学习原理了,所以老师只好先使劲灌输,多少让学生对这些知识有个印象。等学生参加工作后真正遇到这些问题,也许会想起大学好像还学了个叫

数据库

的东西,这些知识就会开始反刍。

数据库,尤其是关系型数据库,非常重要。那为什么要学习其原理呢?

优秀

的工程师来说,只会用

数据库是远远不够的。学习原理对于当CRUDBOY搬砖收益并不大,但当通用组件真的无解

需要自己撸起袖子上时,没有金坷垃怎么种庄稼?设计系统时,理解原理能让你以最少的复杂度代价写出更可靠高效的代码;遇到疑难杂症需要排查时,理解原理能带来精准的直觉与深刻的洞察。

数据库是一个博大精深的领域,存储I/O计算无所不包。其主要原理也可以粗略分为几个部分:数据模型设计原理(应用)、存储引擎原理(基础)、索引与查询优化器的原理(性能)、事务与并发控制的原理(正确性)、故障恢复与复制系统的原理(可靠性)。所有的原理都有其存在意义:为了解决实际问题。

例如

数据模型设计中

的范式理论

,就是为了解决数据冗余

这一问题而提出的,它是为了把事情做漂亮(可维护)

。它是模型设计中一个很重要的设计权衡:通常而言,冗余少则复杂度小/可维护性强,冗余高则性能好

。具体来说,冗余字段能加快特定类型的读取(通过消除连接),但在写入时就需要做更多的工作:维护多对象副本间的一致性,避免多对象事务并发执行时发生踩踏。这就需要仔细权衡利弊,选择合适的规范化等级。数据模型设计,就是生产中的数据结构设计

。不了解这些原理,就难以提取良好的抽象,其他工作也就无从谈起。

关系代数与索引

的原理,则在查询优化中扮演重要的角色,它是为了把事情做得快(性能,可扩展)

。当数据量越来越大,SQL写的越来越复杂时,它的意义就会体现出来:怎样写出等价但是更高效的查询?

当查询优化器没那么智能时,就需要人来干这件事。这种优化往往有四两拨千斤的效果

,比如一个需要几秒的KNN查询,如果知道R树索引的原理,就可以通过改写查询

,创建GIST索引优化到1毫秒内,千倍的性能提升。不了解索引与查询设计原理,就难以充分发挥数据库的性能。

事务与并发控制的原理,

是为了把事情做正确

。事务是数据处理领域最伟大的抽象之一,它提供了很多有用的保证(ACID),但这些保证到底意味着什么?

事务的原子性

让你在提交前能随时中止事务并丢弃所有写入,相应地,事务的持久性

则承诺一旦事务成功提交,即使发生硬件故障或数据库崩溃,写入的任何数据也不会丢失。这让错误处理变得无比简单,所有可能的结果被归结为两种情况:要么成功完事,要么失败了事(或重试)

。有了后悔药,程序员不用再担心半路翻车会留下惨不忍睹的车祸现场了。另一方面,事务的

隔离性

则保证同时执行的事务无法相互影响(在可序列化隔离等级下)。更进一步,数据库提供了不同的隔离等级保证,以供程序员在性能与正确性之间进行权衡

。编写并发程序并不容易,在几万TPS的负载下,各种极低概率,匪夷所思的问题都会出现:事务之间相互踩踏,丢失更新,幻读与写入偏差,慢查询拖慢快查询导致连接堆积,单表数据库并发增大后的性能急剧恶化,比如我遇到的一个最灵异的例子

是:快慢查询总量都减少,但因相对比例变化导致数据库被压垮。这些问题,在低负载的情况下会潜伏着,随着规模量级增长突然跳出来,给你一个大大的惊喜。现实中真正可能出现的各类异常

,也绝非SQL标准中简单的几种异常能说清的。不理解事务的原理,意味着应用的正确性与数据的完整性可能遭受不必要的损失。

故障恢复与复制

的原理,可能对于普通程序员没有那么重要,但架构师与DBA必须清楚。高可用是很多应用的追求目标,但什么是高可用,高可用怎么保证?读写分离?快慢分离?异地多活?x地x中心?说穿了底下的核心技术其实就是复制(Replication)

(或再加上自动故障切换(Failover)

)。这里有无穷无尽的坑:复制延迟

带来的各种灵异现象,网络分区

与脑裂

,存疑事务

,诸如此类。不理解复制的原理,高可用就无从谈起。

对于一些程序员而言,可能数据库就是“增删改查”,包一包接口,原理似乎属于“屠龙之技”。如果止步于此,那原理确实没什么好学的,但有志者应当打破砂锅问到底的精神。私认为只了解自己本领域知识是不够的,只有把当前领域赖以建立的上层领域摸清楚,才能称为专家。在数据库面前,后端也是前端;对于程序员的知识栈而言,数据库是一个合适的栈底。

上面讲了

WHY

,下面就说一下HOW

数据库教学的一个矛盾是:

如果连数据库都不会用,那学数据库原理有个卵用呢?

学数据库的原则是

学以致用

。只有实践,才能带来对问题的深刻理解;只有先知其然,才有条件去知其所以然。

教材可以先草草的过一遍,然后直接去看数据库文档,上手去把数据库用起来,做个东西出来。通过实践掌握数据库的使用,再去学习原理就会事半功倍(以及充满动力)。对于学习而言,有条件去实习当然最好,没有条件那最好的办法就是自己创造场景,自己挖掘需求。

比如,从解决个人需求开始:管理个人密码,体重跟踪,记账,做个小网站、在线聊天App,实用微信小程序。当它演化的越来越复杂,开始有多个用户,出现各种蛋疼问题之后,你就会开始意识到

事务

的意义。再比如,结合爬虫,抓一些房价、股价、地理、社交网络的数据存在数据库里,做一些挖掘与

分析

。当你积累的数据越来越多,分析查询越来越复杂;SQL长得没法读,跑起来慢出猪叫,这时候关系代数的理论就能指导你进一步进行优化。当你意识到这些设计都是为了解决现实生产中的问题,并亲自遇到过这些问题之后,再去学习原理,才能相互印证,并知其所以然。当你发现查询时间随数据增长而指数增长时;当你遇到成千上万的用户同时读写为并发控制焦头烂额时;当你碰上软硬件故障把数据搅得稀巴烂时;当你发现数据冗余让代码复杂度快速爆炸时;你就会发现这些设计存在的意义。

教材、书籍、文档、视频、邮件组、博客都是很好的学习资源。教材的话华章的黑皮系列教材都还不错,《数据库系统概念》这本就挺好的。但我推荐先看看这本书:

《设计数据密集型应用》

,写的非常好,我觉得不错就义务翻译了一下。纸上得来终觉浅,绝知此事要躬行。写了这么多,不带点“

私货

”也不合适哈?实践方能出真知,新手上路选哪家?我个人推荐PostgreSQL,如果能再选一样就加个Redis。对开发而言,这是相当实用的组合。PostgreSQL号称世界上最先进的开源关系型数据库

,源代码写的非常漂亮,有很多值得学习的地方。很多国外的数据库课程与教科书都使用PostgreSQL作为教学样例。PostgreSQL在现实世界中也表现不俗,在我们的实践中,在250WTPS与200TB数据的量级下,

单一PostgreSQL选型

依然能稳如狗地支撑业务。而且其功能丰富到不可思议

,能在很可观的规模内做到一专多长,除了本职的OLTP,Pg还在相当长的时间里兼任了缓存,OLAP,批处理,甚至消息队列的角色。当然如“架构演进”一图所示,神龟虽寿,犹有竟时。最终这些兼职功能还是要逐渐分拆

出去由专用组件负责,但那已经是近千万日活时的事了。所以,关系型数据库虽然强大,却绝非数据处理的终章。数据库的世界非常精彩,尽可能地去尝试各种各样的组件吧~。

OK,关于sql数据库必背知识和数据库相关知识的内容到此结束了,希望对大家有所帮助。

ai写c语言代码(c语言自己写代码赚钱)javascript怎么用,javascript下载官方