80 | 程序员练级攻略:数据库

你好,我是陈皓,网名左耳朵耗子。

对于数据库方向,重点就是两种数据库,一种是以SQL为代表的关系型数据库,另一种是以非SQL为代表的NoSQL数据库。关系型数据库主要有三个:Oracle、MySQL 和 Postgres。

在这里,我们只讨论越来越主流的MySQL数据库。首先,我们要了解数据库的一些实现原理和内存的一些细节,然后我们要知道数据的高可用和数据复制这些比较重要的话题,了解一下关系型数据库的一些实践和难点。然后,我们会进入到NoSQL数据库的学习。

NoSQL数据库千奇百怪,其主要是解决了关系型数据库中的各种问题。第一个大问题就是数据的Schema非常多,用关系型数据库来表示不同的Data Schema是非常笨拙的,所以要有不同的数据库(如时序型、键值对型、搜索型、文档型、图结构型等)。另一个大问题是,关系型数据库的ACID是一件很讨厌的事,这极大地影响了数据库的性能和扩展性,所以NoSQL在这上面做了相应的妥协以解决大规模伸缩的问题。

对于一个程序员,你可能觉得数据库的事都是DBA的事,然而我想告诉你你错了,这些事才真正是程序员的事。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。所以,作为一个架构师或程序员,你必须了解最重要的数据存储——数据库。

关系型数据库

今天,关系型数据库最主要的两个代表是闭源的Oracle和开源的MySQL。当然,还有很多了,比如微软的SQL Server,IBM的DB2等,还有开源的PostgreSQL。关系型数据库的世界中有好多好多产品。当然,还是Oracle和MySQL是比较主流的。所以,这里主要介绍更为开放和主流的MySQL。

如果你要玩Oracle,我这里只推荐一本书《Oracle Database 9i/10g/11g编程艺术》,无论是开发人员还是DBA,它都是必读的书。这本书的作者是Oracle公司的技术副总裁托马斯·凯特(Thomas Kyte),他也是世界顶级的Oracle专家。

这本书中深入分析了Oracle数据库体系结构,包括文件、内存结构以及构成Oracle数据库和实例的底层进程,利用具体示例讨论了一些重要的数据库主题,如锁定、并发控制、事务等。同时分析了数据库中的物理结构,如表、索引和数据类型,并介绍采用哪些技术能最优地使用这些物理结构。

下面还有一些不错的和MySQL相关的文章。

最后,还有一个MySQL的资源列表 Awesome MySQL,这个列表中有很多的工具和开发资源,可以帮助你做很多事。

MySQL有两个比较有名的分支,一个是Percona,另一个是MariaDB,其官网上的Resources页面中有很多不错的资源和文档,可以经常看看。 Percona ResourcesMariaDB Resources ,以及它们的开发博客中也有很多不错的文章,分别为 Percona BlogMariaDB Blog

然后是关于MySQL的一些相关经验型的文章。

关于MySQL的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。

对于MySQL的数据分区来说,还有下面几篇文章你可以看看。

然后,再看看各个公司做MySQL Sharding的一些经验分享。

NoSQL数据库

关于NoSQL数据库,其最初目的就是解决大数据的问题。然而,也有人把其直接用来替换掉关系型数据库。所以在学习这个技术之前,我们需要对这个技术的一些概念和初衷有一定的了解。下面是一些推荐资料。

选SQL还是NoSQL,这里有两篇文章,值得你看看。

各种NoSQL数据库

学习使用NoSQL数据库其实并不是一件很难的事,只要你把官方的文档仔细地读一下,是很容易上手的,而且大多数NoSQL数据库都是开源的,所以,也可以通过代码自己解决问题。下面我主要给出一些典型的NoSQL数据库的一些经验型的文章,供你参考。

列数据库Column Database

针对于HBase有两本书你可以考虑一下。

文档数据库 Document Database - MongoDB, SimpleDB, CouchDB

数据结构数据库 Data structure Database - Redis

时序数据库 Time-Series Database

图数据库 - Graph Platform

搜索数据库 - ElasticSearch

小结

好了,总结一下今天分享的内容。虽然有人会认为数据库与程序员无关,是DBA的事儿。但我坚信,数据库才真正是程序员的事儿。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。

对于数据库方向,重点就是两种数据库,一种是以SQL为代表的关系型数据库,另一种是以非SQL为代表的NoSQL数据库。因而,在这篇文章中,我给出了MySQL和各种开源NoSQL的一些相关的有价值的文章和导读,主要是让你对这些数据库的内在有一定的了解,但又不会太深。同时给出了一些知名企业使用数据库的工程实践,这对于了解各种数据库的优劣非常有帮助,值得认真读读。

从下篇文章开始,我们将进入分布式系统架构方面的内容,里面不仅涵盖了大量的理论知识,更有丰富的入门指导和大量的工程实践。敬请期待。

下面是《程序员练级攻略》系列文章的目录。

精选留言

  • 吐司是只猫

    2018-07-05 09:17:32

    链接的质量很高,但读者更想看耗子的理解和总结吧,希望多点描述性文字。
    作者回复

    在高手篇开篇描述中,我有如下的描述:


    我假设你在前面已经打下了非常扎实的基础,但是要成为一个高手,基础知识只是一个地基,你还需要很多更为具体的技术。对我来说,就是看各种各样的文章、手册、论文、分享…… 其实,学习到一定程度,就是要从书本中走出去,到社区里和大家一起学习,而且还需要自己找食吃了。【所以,对于这里面的文章,有很多都是在罗列各种文章和资源,只是为你梳理信息源,而不是喂你吃饭】。

    老实说,我已经为你梳理并过滤掉了很多的信息,这里只留下了 30% 我觉得最经济也最有价值的信息。虽然对于不同定位和不同需求的人还可以再对这些信息进行删减,但是觉得我这么一做就会对其它人不公平了。【所以,这也是我觉得最小数量集的信息和资源吧。你也可以把我这里的东西当成一个索引来对待】。

    2018-07-05 19:10:03

  • 无风

    2018-07-05 09:15:53

    这一系列看下,真的很难想象皓哥是如何做到如此广面的知识积累
    作者回复

    我至少看了3倍于这些资料的量,才给出这些东西。这主要是兴趣和坚持

    2018-07-05 22:52:06

  • Andy

    2021-01-20 16:35:32

    耗子哥提供了很好的学习资源,但我觉得还是需要注意一点,不要沉溺于这些知识细节之中,把握关键点,根据自身需要去有的放矢的学习和实践,这才是最高效的学习方法,以自我的问题和需求出发,去寻找解决方案,构建自己的知识体系。切记,吾生也有涯,而知也无涯,以有涯随无涯,殆已!
  • 刘強

    2018-07-07 11:32:58

    资料看多了,我对高手有了不同的理解。我觉得真正的高手是有自己的想法,自己的个性,独特的思维,解决问题的方式。看书再多,都理解了,都掌握了,顶多也不过是嚼别人嚼过的东西。这样的人貌似比大多数人强,其实他只不过是比别人看的多而已。有自己的思考,有自己独特的思想,有自己的输出,进而影响到别人,这才叫高手。我认为黑客才是真正的高手。这里的黑客是黑客与画家里面的定义。
  • yanfan_software

    2018-07-05 12:01:22

    会用数据库并不代表就能设计好数据库,设计数据库与业务关联,需要了解用户需求和业务联系,这篇文章主要是介绍各个数据库的而非设计,但也没提太多底层,数据库优化,希望耗子叔可以抽空给讲讲这些。
  • 少年姜太公

    2018-07-07 09:37:06

    耗子叔,除了阅读书籍、博客和论文,有没有开源代码阅读经验分享。我的体会是阅读优秀开源代码就好比阅读经典文学作品,从中学习编程风格,设计思想以提高自身代码编写质量,偶尔还能把某些开源项目的代码片段、编写思路应用到自己代码中。求耗子叔分享一下阅读开源项目和提高编程水平的经验
  • 1 Player

    2018-07-05 21:03:53

    皓叔,有些东西学习过后,一段时间不用就会忘了。怎么解决这种问题呢。
  • 杨书清

    2018-07-05 08:35:09

    感觉对普通程序猿来说数据库的建模和设计也很重要,有这方面的资料推荐么?
  • 我是曾经那个少年

    2018-07-05 11:36:26

    我报一下坐标,深圳南山四年Java,老师程序员练级攻略我95%都不会,是不是我太菜了!
  • songyy

    2018-07-10 13:57:52

    我最近在读 《designing data intensive application》其中深入浅出地比较了数据库的基本算法,解决数据方面问题的模式 感觉内容很棒
  • 高宇

    2018-07-06 12:26:12

    读者交流群申请表提交了没有回复,也不知道具体什么情况
  • 杨寅冬

    2018-08-11 07:20:43

    大数据方面的会写一篇吗,hadoop,spark等
  • Geek_217683

    2018-07-06 10:37:20

    耗子哥,能不能谈谈你对编辑器选择的看法,Vim,Emacs,是否还需要?
  • 50infivedays

    2018-07-05 21:02:57

    怎么加读者群呀 我关注公众号也回复了公众号 还是不行
  • 。。。

    2018-07-05 07:23:13

    耗子叔,请教一个问题啊,go 能开发网站和写爬虫吗?我个人初步判断是,可以做网站,因为有web 框架,也可以写爬虫,因为能解析HTML 。求解~
  • Geek_85dec8

    2023-01-10 14:06:53

    《MailChimp: Using Shards to Accommodate Millions of Users》
    耗子叔,这个文章的超链接是不是需要更新了,点进去找不到此标题的文章😭
  • 一墨

    2020-06-15 11:15:39

    有一种I can't breathe的感觉... 不过一定要挺过来
  • Geek_58e979

    2020-04-22 18:00:50

    这一梳理省去了好多信息干扰,留下精华的。
  • 文盲筱烨

    2018-07-17 21:49:58

    陈老师, 请教下,pg数据库未来的发展 数据库有点群雄四起
    作者回复

    我对pg不熟悉,我只知道pg还没到主流数据库的程度。未来是否有大发展还看是否有大公司支持,是否有杀手级应用,目前还看不到。

    2018-07-18 10:30:06

  • 迎风追日

    2025-01-02 22:06:20

    打卡,感谢耗叔!