精华内容
下载资源
问答
  • 1.什么数据库数据库文件有什么特点? 数据库是一种依照特定数据模型组织、存储和管理数据的数据文件。这种数据文件一般放在磁盘存储器中,以便长久保存。 1)数据不重复存放。 2)支持多个应用并发访问。 3...

    1.什么是数据库?数据库文件有什么特点?

    数据库是一种依照特定数据模型组织存储管理数据的数据文件。这种数据文件一般放在磁盘存储器中,以便长久保存。

    1)数据不重复存放。

    2)支持多个应用并发访问。

    3)数据结构独立于使用它的应用程序。

    4)对数据增、删、改、查由统一的软件进行控制和管理。

     

    2.什么是数据模型?什么是数据库模型?数据库模型的分类?

    数据模型是指描述事物对象的数据组成数据关系数据约束的抽象结构及其说明

    1}数据结构:用于描述事物对象的静态特征,包括事物对象的数据组成、数据类型、数据性质及其数据之间的关系。

    2)数据操作:用于描述事物对象的动态特征,包括数据的插入、修改、删除和查询等访问操作。

    3)数据约束:用于描述数据结构中数据之间的语义联系、数据之间的制约和依存关系,以及数据动态变化的规则。

    数据库模型是指数据库所使用的数据模型。

    1)层次数据模型:采用“树结构”来组织、存储和管理数据

    2)网状数据模型:采用“网状图”结构组织、存储和管理数据

    3)关系数据模型:采用“二维表”结构组织、存储和管理数据

    4)其他数据模型:对象、列式、键值对数据模型。

     

    3.数据库系统的组成

    1)数据库用户:数据库系统的使用人员

    2)数据库应用程序:在DBMS(数据库管理系统)支持下进行用户数据处理的应用程序

    3)数据库管理系统:一种专门用来创建数据库、管理数据库、维护数据库、并提供对数据库访问的系统软件

    4)数据库:一种依照特定模型组织、存储和管理数据的容器文件。在数据库中不仅存放了数据,而且还存放了数据与数据之间的关系

     

    4.数据库应用系统类型和结构

    1)业务处理系统

    2)管理信息系统

    3)决策支持系统

    数据库系统应用结构:

    1)单机结构:数据不能共享,数据冗余度大。

    2)集中式结构:数据库系统的应用程序、DBMS、数据,都放在同一个主机上,多个用户同时并发存取数据、共享数据,结构简单,易于维护,访问量不能过大

    3)客户/服务器结构:某个节点计算机执行DBMS核心功能,节点服务器为数据库服务器,其他节点上的计算机安装DBMS外围应用开发工具和应用程序。称为客户机。即把DBMS和应用程序分开的结构。

    4)分布式结构:数据库中的数据在逻辑上为一个整体,但物理分布在计算机网络的不同数据库服务器节点进行数据存储与处理。网络中每一个数据库服务器节点可以独立的处理数据。

     

    问题讨论

    1)数据库、数据库管理系统、数据库系统三个概念有什么区别?

    数据库:数据库是一种依照特定数据模型组织存储管理数据的数据文件。

    数据库管理系统:一种专门用来创建数据库、管理数据库、维护数据库、并提供对数据库访问的系统软件

    数据库系统:数据库系统(Database System),是由数据库及其管理软件组成的系统

     

    2)元数据和用户数据的区别是什么?

    关系数据库的数据分类:用户数据、元数据、索引数据、其他数据。

    元数据:是一种专门描述数据库结构的数据。即是数据的属性。

    用户数据:是实例,数据库中的一条记录。

     

    3)实现应用软件的表单数据输入是数据库管理系统的功能吗?

    不是,是数据库应用程序的功能:创建并处理表单、处理用户查询、创建并处理报表、执行应用逻辑、控制其它应用程序

    数据库管理系统(DBMS):创建数据库、数据表及其他对象;读取、修改、删除数据库表数据;维护数据库结构;提供数据库并发访问控制和安全性控制;执行数据库备份和恢复。

     

    4)数据库软件是指数据库应用程序,还是指数据库管理系统(DBMS)?

    数据库应用程序:在DBMS(数据库管理系统)支持下进行用户数据处理的应用程序

    数据库管理系统:一种专门用来创建数据库、管理数据库、维护数据库、并提供对数据库访问的系统软件。

    因此是指数据库管理系统。

     

    5)文件方式与数据方式的数据管理区别是什么?

    文件系统管理系统:

        1.由文件系统管理数据;

         2.应用程序仍然依赖数据对象;

         3.应用之间数据共享程度较差、冗余度大;

         4.数据文件记录内有结构,整体无结构;

         5.数据独立性差,数据的逻辑结构改变必须修改应用程序;

         6.应用程序自己维护数据。

    数据库管理阶段的特点:

           1.数据结构化

           2.数据的共享性高,冗余度低,易扩充

           3.数据独立性高

           4.数据由DBMS(数据库管理系统)统一管理和控制

     

    6)数据库应用系统开发阶段

    (1)需求分析

    (2)系统设计

    (3)系统实现

    (4)系统测试

    (5)系统运行与维护

     

    7) 典型数据库系统举例:

    ACCESS:微软桌面数据库

    SQL SERVER:微软商用数据库

    ORACLE:甲骨文企业级数据库

    IBM DB2:IBM公司企业级

    SYBASS ASE:SYBASS 公司企业级

    MYSQL:开源数据库管理系统

     

     

     

     

     

     


     

     

     

     

     

     

     

     

    展开全文
  • MySQL数据库原理应用项目9维护学生信息管理数据库的安全性学习目标 了解MySQL的权限系统 掌握MySQL的用户管理和权限管理的方法 掌握各种数据备份和数据还原的方法 掌握数据库迁移的方法 掌握数据的导入导出的...
  • 如果能再把离散数学、数字电路、体系结构、数据结构/算法、编译原理学通透,再加上丰富的实践经验领域特定知识,就能算是一个优秀的工程师了。 计算机其实就是存储/IO/CPU三大件; 而计算说穿了就是两个东西:...

    只会写代码的是码农;学好数据库,基本能混口饭吃;在此基础上再学好操作系统和计算机网络,就能当一个不错的程序员。如果能再把离散数学、数字电路、体系结构、数据结构/算法、编译原理学通透,再加上丰富的实践经验与领域特定知识,就能算是一个优秀的工程师了。

    计算机其实就是存储/IO/CPU三大件; 而计算说穿了就是两个东西:数据与算法(状态与转移函数)。常见的软件应用,除了各种模拟仿真、模型训练、视频游戏这些属于计算密集型应用外,绝大多数都属于数据密集型应用。从最抽象的意义上讲,这些应用干的事儿就是把数据拿进来,存进数据库,需要的时候再拿出来。

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

    互联网应用大多属于数据密集型应用,对于真实世界的数据密集型应用而言,除非你准备从基础组件的轮子造起,不然根本没那么多机会去摆弄花哨的数据结构和算法。甚至写代码的本事可能也没那么重要:可能只会有那么一两个Ad Hoc算法需要在应用层实现,大部分需求都有现成的轮子可以使用,主要的创造性工作往往在数据模型与数据流设计上。实际生产中,数据表就是数据结构,索引与查询就是算法。而应用代码往往扮演的是胶水的角色,处理IO与业务逻辑,其他大部分工作都是在数据系统之间搬运数据。

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

    • 数据库:存储数据,以便自己或其他应用程序之后能再次找到(PostgreSQL,MySQL,Oracle)
    • 缓存:记住开销昂贵操作的结果,加快读取速度(Redis,Memcached)
    • 搜索索引:允许用户按关键字搜索数据,或以各种方式对数据进行过滤(ElasticSearch)
    • 流处理:向其他进程发送消息,进行异步处理(Kafka,Flink,Storm)
    • 批处理:定期处理累积的大批量数据(Hadoop)

    架构师最重要的能力之一,就是了解这些组件的性能特点与应用场景,能够灵活地权衡取舍、集成拼接这些数据系统。绝大多数工程师都不会去从零开始编写存储引擎,因为在开发应用时,数据库已经是足够完美的工具了。关系型数据库则是目前所有数据系统中使用最广泛的组件,可以说是程序员吃饭的主要家伙,重要性不言而喻。 

    图:架构演化:一种分拆方法

    对玩具应用而言,使用内存变量与文件来保存状态也许已经绰绰有余了。但随着系统的增长,我们会遇到越来越多的挑战:软硬件故障把数据搞成一团浆糊(可靠性);状态太多而内存太小放不下(可伸缩性);并发访问控制导致代码复杂度发生爆炸(可维护性),诸如此类。这些问题相当棘手,却又相当普遍,数据库就是用来解决这些问题的。分拆是架构演化的重要方法论,数据库将状态管理的职能从应用程序中分拆出来,即所谓的“状态与计算相分离”。数据库将程序员从重复造轮子的泥潭中解救出来,极大地解放了生产力。

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

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

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

    对优秀的工程师来说,只会用数据库是远远不够的。学习原理对于当CRUD BOY搬砖收益并不大,但当通用组件真的无解需要自己撸起袖子上时,没有金坷垃怎么种庄稼?设计系统时,理解原理能让你以最少的复杂度代价写出更可靠高效的代码;遇到疑难杂症需要排查时,理解原理能带来精准的直觉与深刻的洞察。

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

    例如数据模型设计中的范式理论,就是为了解决数据冗余这一问题而提出的,它是为了把事情做漂亮(可维护)。它是模型设计中一个很重要的设计权衡:通常而言,冗余少则复杂度小/可维护性强,冗余高则性能好。具体来说,冗余字段能加快特定类型的读取(通过消除连接),但在写入时就需要做更多的工作:维护多对象副本间的一致性,避免多对象事务并发执行时发生踩踏。这就需要仔细权衡利弊,选择合适的规范化等级。数据模型设计,就是生产中的数据结构设计。不了解这些原理,就难以提取良好的抽象,其他工作也就无从谈起。

    而关系代数与索引的原理,则在查询优化中扮演重要的角色,它是为了把事情做得快(性能,可扩展)。当数据量越来越大,SQL写的越来越复杂时,它的意义就会体现出来:怎样写出等价但是更高效的查询?当查询优化器没那么智能时,就需要人来干这件事。这种优化往往有四两拨千斤的效果,比如一个需要几秒的KNN查询,如果知道R树索引的原理,就可以通过改写查询,创建GIST索引优化到1毫秒内,千倍的性能提升。不了解索引与查询设计原理,就难以充分发挥数据库的性能。

    图:估算表膨胀率的复杂SQL一例,能在50ms内完成

    事务与并发控制的原理,是为了把事情做正确。事务是数据处理领域最伟大的抽象之一,它提供了很多有用的保证(ACID),但这些保证到底意味着什么?事务的原子性让你在提交前能随时中止事务并丢弃所有写入,相应地,事务的持久性则承诺一旦事务成功提交,即使发生硬件故障或数据库崩溃,写入的任何数据也不会丢失。这让错误处理变得无比简单,所有可能的结果被归结为两种情况:要么成功完事,要么失败了事(或重试)。有了后悔药,程序员不用再担心半路翻车会留下惨不忍睹的车祸现场了。

    另一方面,事务的隔离性则保证同时执行的事务无法相互影响(在可序列化隔离等级下)。更进一步,数据库提供了不同的隔离等级保证,以供程序员在性能与正确性之间进行权衡。编写并发程序并不容易,在几万TPS的负载下,各种极低概率,匪夷所思的问题都会出现:事务之间相互踩踏,丢失更新,幻读与写入偏差,慢查询拖慢快查询导致连接堆积,单表数据库并发增大后的性能急剧恶化,比如我遇到的一个最灵异的例子是:快慢查询总量都减少,但因相对比例变化导致数据库被压垮。这些问题,在低负载的情况下会潜伏着,随着规模量级增长突然跳出来,给你一个大大的惊喜。现实中真正可能出现的各类异常,也绝非SQL标准中简单的几种异常能说清的。 不理解事务的原理,意味着应用的正确性与数据的完整性可能遭受不必要的损失。

    图:隔离等级与一致性

    故障恢复与复制的原理,可能对于普通程序员没有那么重要,但架构师与DBA必须清楚。高可用是很多应用的追求目标,但什么是高可用,高可用怎么保证?读写分离?快慢分离?异地多活?x地x中心?说穿了底下的核心技术其实就是复制(Replication)(或再加上自动故障切换(Failover))。这里有无穷无尽的坑:复制延迟带来的各种灵异现象,网络分区与脑裂,存疑事务,诸如此类。 不理解复制的原理,高可用就无从谈起。

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

     

    https://www.sohu.com/a/237554990_671058

    转载于:https://www.cnblogs.com/feng9exe/p/9914516.html

    展开全文
  • 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了...


    前言

    这篇文章,我们将通过知识点以及例子来了解SQL Server中主键、外键以及联合主键和复合主键的相关创建操作,以下我们均使用T-SQL语句来创建。

    注:以下例子中所有的数据表都创建在Sales数据库下。

    一、主键、联合主键和复合主键

    (一)主键

    主键格式:
    主键即在要设置的字段的后面加上PRIMARY KEY就可以了。

    我们给出下表,也就是我们接下来要用T-SQL语句进行操作的表:
    在这里插入图片描述

    在SQL Server查询分析器中输入以下语句:

    USE Sales
    CREATE TABLE Category
    (
      CategoryID int NOT NULL PRIMARY KEY,
      CategoryName varchar(20) NOT NULL,
      Description varchar(80) NULL
    )
    

    (二)联合主键

    联合主键就是用多个字段一起组成主键,例如:

    USE Sales
    CREATE TABLE grade
    (
      student char(10) NOT NULL,
      coursestudent char10NOT NULL,
      grade int NOT NULL,
      PRIMARY KEY(student,coursestudent)
    )
    

    其中字段student和coursestudent就是联合主键

    (三)复合主键

    复合主键跟联合主键的差别是联合主键体现在多个表上,而复合主键体现在一个表中的多个字段。复合主键即数据表中的主键含有一个以上的字段组成。
    例如:

    USE Sales
    CREATE TABLE Test
    (
      NO_1 char(10) NULL, 
      NO_2 char(20) NOT NULL,
      NO_3 varchar(10) NOT NULL,
      PRIMARY KEY(NO_1,NO_2)
    )
    

    这上面的PRIMARY KEY(NO_1,NO_2)组合起来就是复合主键

    二、外键、设置种子数目和增量

    (一)外键的概念

    外键即用于与另外一个数据表的关联,是确定另一个表的字段,例如有两个表分别是基本表A和信息表B,其中C是表A的主键,而表B中也有C字段,则我们称C就是B的外键,所以外键的作用就是来维护多个表之间数据的一致性。

    (二)添加外键

    添加外键我们分为两种,一种是在创建数据表时设置外键,另一种则是修改表的形式来设置,我们先来看第一种的格式:

    CREATE TABLE Test
    (
      列名 <参数>,[,...n]
      FOREIGN KEY <列名> REFERENCES <目标表名>
    )
    

    第二种格式,也就是我们已经创建了表,现在通过修改表来添加外键:

    ALTER TABLE Test
      ADD CONSTRAINT <外键名> REFERENCES <外键表(即被别的表引为外键的表)>
    
    

    (三)设置种子数目和增量

    设置种子数目和增量的格式是:
    列名 IDENTITY(种子数目,种子增量)

    e.g.

    USE Sales
    CREATE TABLE Test
    (
      NO_1 char(10) IDENTITY(1000,1) NULL, 
      NO_2 char(20) NOT NULL,
      NO_3 varchar(10) NOT NULL,
      PRIMARY KEY(NO_1,NO_2)
    )
    

    上sql语句中,“NO_1 char(10) IDENTITY(1000,1) NULL”, IDENTITY(1000,1)表示的含义就是其约束是自动增长种子1000,增长值为1。

    接下来我们通过一个例子来深刻了解外键以及设置种子数目和增量的用法来创建数据表。
    例:给出下表,使用T-SQL语句进行建表
    在这里插入图片描述

    在SQL Server查询分析器中输入以下语句:

    USE Sales
    CREATE TABLE Orders
    (
      OrderID int IDENTITY(1001,1) NOT NULL PRIMARY KEY,
      CustomerID char(3) NOT NULL ,
      SaleID char(3) NOT NULL,
      OrderDate datetime NULL,
      Notes varchar(80) NULL,
      FOREIGN KEY CustomerID REFERENCES Orders,
      FOREIGN KEY SaleID REFERENCES Orders
    )
    

    结语

    文章到此结束,如有错误欢迎读者指出!

    展开全文
  • 如果能再把离散数学、数字电路、体系结构、数据结构/算法、编译原理学通透,再加上丰富的实践经验领域特定知识,就能算是一个优秀的工程师了。 ​ 计算机其实就是存储/IO/CPU三大件; 而计算说穿了就是两个东西:...

    只会写代码的是码农;学好数据库,基本能混口饭吃;在此基础上再学好操作系统和计算机网络,就能当一个不错的程序员。如果能再把离散数学、数字电路、体系结构、数据结构/算法、编译原理学通透,再加上丰富的实践经验与领域特定知识,就能算是一个优秀的工程师了。

    计算机其实就是存储/IO/CPU三大件; 而计算说穿了就是两个东西:数据与算法(状态与转移函数)。常见的软件应用,除了各种模拟仿真、模型训练、视频游戏这些属于计算密集型应用外,绝大多数都属于数据密集型应用。从最抽象的意义上讲,这些应用干的事儿就是把数据拿进来,存进数据库,需要的时候再拿出来。

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

    互联网应用大多属于数据密集型应用,对于真实世界的数据密集型应用而言,除非你准备从基础组件的轮子造起,不然根本没那么多机会去摆弄花哨的数据结构和算法。甚至写代码的本事可能也没那么重要:可能只会有那么一两个Ad Hoc算法需要在应用层实现,大部分需求都有现成的轮子可以使用,主要的创造性工作往往在数据模型与数据流设计上。实际生产中,数据表就是数据结构,索引与查询就是算法。而应用代码往往扮演的是胶水的角色,处理IO与业务逻辑,其他大部分工作都是在数据系统之间搬运数据

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

    • 数据库:存储数据,以便自己或其他应用程序之后能再次找到(PostgreSQL,MySQL,Oracle)
    • 缓存:记住开销昂贵操作的结果,加快读取速度(Redis,Memcached)
    • 搜索索引:允许用户按关键字搜索数据,或以各种方式对数据进行过滤(ElasticSearch)
    • 流处理:向其他进程发送消息,进行异步处理(Kafka,Flink,Storm)
    • 批处理:定期处理累积的大批量数据(Hadoop)

    架构师最重要的能力之一,就是了解这些组件的性能特点与应用场景,能够灵活地权衡取舍、集成拼接这些数据系统。绝大多数工程师都不会去从零开始编写存储引擎,因为在开发应用时,数据库已经是足够完美的工具了。关系型数据库则是目前所有数据系统中使用最广泛的组件,可以说是程序员吃饭的主要家伙,重要性不言而喻。

    架构演化:一种分拆方法

    对玩具应用而言,使用内存变量与文件来保存状态也许已经绰绰有余了。但随着系统的增长,我们会遇到越来越多的挑战:软硬件故障把数据搞成一团浆糊(可靠性);状态太多而内存太小放不下(可伸缩性);并发访问控制导致代码复杂度发生爆炸(可维护性),诸如此类。这些问题相当棘手,却又相当普遍,数据库就是用来解决这些问题的。分拆是架构演化的重要方法论,数据库将状态管理的职能从应用程序中分拆出来,即所谓的“状态与计算相分离”。数据库将程序员从重复造轮子的泥潭中解救出来,极大地解放了生产力。

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

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


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

    ​ 对优秀的工程师来说,只会数据库是远远不够的。学习原理对于当CRUD BOY搬砖收益并不大,但当通用组件真的无解需要自己撸起袖子上时,没有金坷垃怎么种庄稼?设计系统时,理解原理能让你以最少的复杂度代价写出更可靠高效的代码;遇到疑难杂症需要排查时,理解原理能带来精准的直觉与深刻的洞察。

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

    ​ 例如数据模型设计中范式理论,就是为了解决数据冗余这一问题而提出的,它是为了把事情做漂亮(可维护)。它是模型设计中一个很重要的设计权衡:通常而言,冗余少则复杂度小/可维护性强,冗余高则性能好。具体来说,冗余字段能加快特定类型的读取(通过消除连接),但在写入时就需要做更多的工作:维护多对象副本间的一致性,避免多对象事务并发执行时发生踩踏。这就需要仔细权衡利弊,选择合适的规范化等级。数据模型设计,就是生产中的数据结构设计不了解这些原理,就难以提取良好的抽象,其他工作也就无从谈起。

    ​ 而关系代数与索引的原理,则在查询优化中扮演重要的角色,它是为了把事情做得快(性能,可扩展)。当数据量越来越大,SQL写的越来越复杂时,它的意义就会体现出来:怎样写出等价但是更高效的查询?当查询优化器没那么智能时,就需要人来干这件事。这种优化往往有四两拨千斤的效果,比如一个需要几秒的KNN查询,如果知道R树索引的原理,就可以通过改写查询,创建GIST索引优化到1毫秒内,千倍的性能提升。不了解索引与查询设计原理,就难以充分发挥数据库的性能。

    估算表膨胀率的复杂SQL一例,能在50ms内完成

    ​ 事务与并发控制的原理,是为了把事情做正确。事务是数据处理领域最伟大的抽象之一,它提供了很多有用的保证(ACID),但这些保证到底意味着什么?事务的原子性让你在提交前能随时中止事务并丢弃所有写入,相应地,事务的持久性则承诺一旦事务成功提交,即使发生硬件故障或数据库崩溃,写入的任何数据也不会丢失。这让错误处理变得无比简单,所有可能的结果被归结为两种情况:要么成功完事,要么失败了事(或重试)。有了后悔药,程序员不用再担心半路翻车会留下惨不忍睹的车祸现场了。

    另一方面,事务的隔离性则保证同时执行的事务无法相互影响(在可序列化隔离等级下)。更进一步,数据库提供了不同的隔离等级保证,以供程序员在性能与正确性之间进行权衡。编写并发程序并不容易,在几万TPS的负载下,各种极低概率,匪夷所思的问题都会出现:事务之间相互踩踏,丢失更新,幻读与写入偏差,慢查询拖慢快查询导致连接堆积,单表数据库并发增大后的性能急剧恶化,比如我遇到的一个最灵异的例子是:快慢查询总量都减少,但因相对比例变化导致数据库被压垮。这些问题,在低负载的情况下会潜伏着,随着规模量级增长突然跳出来,给你一个大大的惊喜。现实中真正可能出现的各类异常,也绝非SQL标准中简单的几种异常能说清的。 不理解事务的原理,意味着应用的正确性与数据的完整性可能遭受不必要的损失。

    隔离等级与一致性

    故障恢复与复制的原理,可能对于普通程序员没有那么重要,但架构师与DBA必须清楚。高可用是很多应用的追求目标,但什么是高可用,高可用怎么保证?读写分离?快慢分离?异地多活?x地x中心?说穿了底下的核心技术其实就是复制(Replication)(或再加上自动故障切换(Failover))。这里有无穷无尽的坑:复制延迟带来的各种灵异现象,网络分区脑裂存疑事务 ,诸如此类。 不理解复制的原理,高可用就无从谈起。

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


    ​ 上面讲了WHY,下面就说一下 HOW

    ​ 数据库教学的一个矛盾是:如果连数据库都不会用,那学数据库原理有个卵用呢?

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

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

    ​ 再比如,结合爬虫,抓一些房价、股价、地理、社交网络的数据存在数据库里,做一些挖掘与分析。当你积累的数据越来越多,分析查询越来越复杂;SQL长得没法读,跑起来慢出猪叫,这时候关系代数的理论就能指导你进一步进行优化。

    ​ 当你意识到这些设计都是为了解决现实生产中的问题,并亲自遇到过这些问题之后,再去学习原理,才能相互印证,并知其所以然。当你发现查询时间随数据增长而指数增长时;当你遇到成千上万的用户同时读写为并发控制焦头烂额时;当你碰上软硬件故障把数据搅得稀巴烂时;当你发现数据冗余让代码复杂度快速爆炸时;你就会发现这些设计存在的意义。

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


    纸上得来终觉浅,绝知此事要躬行。写了这么多,不带点“私货”也不合适哈?实践方能出真知,新手上路选哪家?我个人推荐PostgreSQL,如果能再选一样就加个Redis。对开发而言,这是相当实用的组合。PostgreSQL号称世界上最先进的开源关系型数据库,源代码写的非常漂亮,有很多值得学习的地方。很多国外的数据库课程与教科书都使用PostgreSQL作为教学样例。

    PostgreSQL在现实世界中也表现不俗,在我们的实践中,在250WTPS与200TB数据的量级下,单一PostgreSQL选型依然能稳如狗地支撑业务。而且其功能丰富到不可思议,能在很可观的规模内做到一专多长,除了本职的OLTP,Pg还在相当长的时间里兼任了缓存,OLAP,批处理,甚至消息队列的角色。当然如“架构演进”一图所示,神龟虽寿,犹有竟时。最终这些兼职功能还是要逐渐分拆出去由专用组件负责,但那已经是近千万日活时的事了。

    所以,关系型数据库虽然强大,却绝非数据处理的终章。数据库的世界非常精彩,尽可能地去尝试各种各样的组件吧~。

    还有就是这我总结出了一些架构视频资料和互联网公司java程序员面试涉及到的绝大部分面试题和答案做成了文档和架构视频资料还有完整高清的java进阶架构学习思维导图免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。 资料领取方式:关注 私信关键字【资料】即可免费获取!!!

    如果您喜欢本文章,可以点击关注,每天将有更多精彩文章与您分享!

    展开全文
  • 《大数据技术原理与应用》第一周学习计划 什么是大数据? 首先什么是大数据?书籍内容从4V角度解释了什么是大数据:Velocity快速化,Variety多样化,Value价值密度低(商业价值高),Volume大量化 从数据角度来分...
  • 数据、数据库数据库管理系统、数据库系统、数据库系统的特点等基本概念的定义理解。 ; margin-right:0cm">数据模型:层次、网状、关系、E-R模型等的构造形式及特点。重点是关系及E-R模型,要求熟练...
  • JAVA与数据库的课程整合教学改革-数据库理论论文-计算机论文 文章均为WORD文档下载后可直接编辑使用亦可打印 摘要:Java程序设计与数据库原理与应用是医学院校生物信息专业开设的两门课程由于Java程序设计高级开发...
  • 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。...
  • 文章目录ORM框架原理与应用前言一、ORM框架是什么?二、Hibernate是什么?三、使用步骤1.创建项目2.创建数据库3.添加Hibernate配置文件4.添加实体类及其配置文件4.使用Hibernate实现用户添加总结 前言 提示:这里...
  • 1.计算机系为什么学数据库原理和设计? 计算机系为什么学数据库原理和设计?[知乎] 2.为什么学习数据库设计数据库建模? 数据库的设计产品的需求息息相关,一个好的应用,一定有一个设计合适的数据库,只有充分...
  •  本书是一本讲述数据库系统原理的教材,重点强调数据库建模设计的基础、数据库管理系统提供的语言和工具以及系统实现技术。全书共分4个部分,第一部分介绍最基本的概念、术语及建模原则,第二部分描述了关系数据...
  •  本书是一本讲述数据库系统原理的经典教材,重点强调了数据库的设计实现。全书分为4部分。第一部分讲述事务处理的概念、并发控制技术和数据库恢复技术;第二部分讲述面向数据库的概念、语言、设计及对象-关系和...
  • 本文从MySQL的数据结构和设计思路出发剖析了索引、事务、锁等机制的实现原理,并对一些常见的MySQL使用特性进行了原理的佐证,引申出一些实用小技巧,本文零零碎碎耗费了本人两个星期左右时间,总结的很完善了,素材...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • mysql之索引原理与慢查询优化 一、介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出...
  • 到底什么是关系数据库

    万次阅读 2009-08-05 10:07:00
    了一段时间的数据库了,回过头来看看,竟然还清楚关系数据库原理什么,惭愧。先学习一下“牛人”的见解,以后慢慢的消化理解。 数据库是以某种数据模型所确定的数据结构方式来组织和存储某个组织(或部门)...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...
  • 本书介绍了Oracle的安装及卸载、数据库的启动关闭、表空间和数据文件的管理、Oracle网络管理、口令文件管理、内存管理、进程管理、用户管理、数据的导入导出、备份恢复、模式对象的管理以及应用程序开发等相关知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 602
精华内容 240
关键字:

数据库原理与应用学什么