双葉幼稚園 A Layman's Repository

我们的数据库课

很久之前的一篇文章,怎么也是上上学期吧,写成草稿了,现在贴出来吧。

我并不是要批评我们的老师,我觉得我们的老师还是挺负责任的,能讲到的还是尽量讲到还是都讲到了。

其实最重要的是我并不知道这课到底是在讲什么,老师在某节课上说:“我们这门课主要是讲授数据库理论,这个内容就不讲了”(意思是这样的)。当时我就震惊了,我一直以为这门课讲的是数据库如何使用数据库的……老师上课的时候也经常说作为数据库的使用者如何如何,那我们的这门课到底是在讲理论还是使用呢……

作为大学的课程,我认为应该以理论为主,怎样使用只是顺带一提,以自学为主就好,就像传言中国外大学某些课程一样,一次课讲完一门语言,SQL 这种东西完全可以一次课讲完,剩下的靠大家自学或者直接实践,但是上半学期除了绪论,就一直在讲关系代数和 SQL,这个东西需要这么多时间来讲吗?我个人认为,4个课时就足够了(可能有点太激进了)。这门课上用了八周,也就是 22 个课时来讲这些东西。

我是一个理论比较弱的人,所以就想着靠学校里的数据库课补一下理论知识的。在我眼中,这门课讲的东西确实是必须的,但是内容太少了,深度也不够。这个 playlist 是印度一所大学的数据库课程,我只看了标题,来比较一下我们课程的内容。Lecture 1~9 我们是讲过的,10~16 没讲过,17~23 讲过,24~26 没讲过,27~29 讲过,30~42 没讲过,只有 19/42 的内容我们覆盖到了,也就是只有 45%。看看我们漏掉了什么东西,存储过程、索引、查询过程和优化、分布式数据库、数据挖掘、XML 和对象数据库还有很多 case study。我想要的是什么?我想学的就是数据库是怎么实现的,存储过程、索引、查询过程和优化为什么没有?这是本科教育对吗?不是职业教育,我们要知道原理才能更好地利用数据库,对吗?学校里学不到的指望我们在工作中学吗?大家都清楚,工作了就更没有机会去学理论了。怎样用 SQL 需要教吗?DBMS 就会告诉你你的 SQL 是对是错,你也能一眼看出来结果是否正确,尝试一下,总会正确的。但是如果你一句 SQL 执行了一分钟,DBMS 会告诉你为什么吗?会告诉你子查询的速度慢吗?会告诉你优化器做了什么吗?会告诉你中间创建了哪些临时表吗?不会的,起码不会一眼就看出来,你需要理论知识的支持,可是这门课给了我们什么?

要说这门课重视实践,那我又不明白了。现在起码在互联网方面,大家都只是把数据库当作一个存储数据的地方,很多高级的功能、很复杂的 SQL 都很少出现,那么我们写一堆长长的带着子查询,带着 ANY 带着 EXISTS 的东西有什么用呢?做教务系统吗?用非常复杂的 SQL 来实现一些应用语言很容易就能实现的功能有什么必要呢?SQL 不是过程化的,非得拿他来做一些过程化的事情不是强人所难吗?我在 QCon 会场抢了两本书——《SQL沉思录》《SQL解惑》里面写的内容就是用 SQL 做一些非常奇怪的问题,甚至于解决稳定婚姻问题(谜题67),这种东西真的有用吗?作者当时的时代还是 SQL 大行其道的时候,可能写这样的东西练习 SQL 还说的过去,但是现在 SQL 并没有那么热,各种 NoSQL 纷纷出现的现在,练习 SQL 而不是学习数据库本身的理论有什么价值呢?拿索引来说,就算某种数据库并不是利用 SQL 进行查询,那它为了性能也需要一个类似索引的东西,对吗?只要这种索引还是要用 B 树或者散列表,那我们学习索引的理论就还是有用的。就这两本书被随意赠送的可怜的处境来看,整页的 SQL 真的没有什么用。

说一个比较极端的例子,教大家使用数据库的时候并没有提到 LIMIT,可能很多人并不会知道 SELECT id FROM user ORDER BY id LIMIT 100000, 5 为什么总是慢的要死。

还有一个问题,这个希望老师改进一下,老师上课演示的所有 SQL 语句里面的关键字都是小写,SQL 是不区分大小写,但是我们都知道关键字推荐是全部大写的,希望以后不会看到我同学写出小写关键字的 SQL……我们都懒,但是老师需要教学生养成良好的习惯,不是吗?

发这么多牢骚,其实还是对数据库这么课抱了很大期望,希望能补一下数据库的知识,不幸让我失望了。还是自己学吧,印度人虽然英语非常差,但是讲数据库应该还可以。

好在期末考试没有非常坑,没有非常古怪的题目,算是真的考察水平吧,不过还是希望能多些理论知识,让同学多一些进步。我觉得现在所有的内容压缩到上半学期,下半学期讲些理论和 case study 会非常好。