数据库这门课为什么这么难学，该怎么学？
数据库这个东西，（曾经）就是一个数据管理的系统级软件，事实上，Oracle数据库是可以不要操作系统支持的。自NoSQL兴起后，数据库就是一个专门用于数据管理的计算机系统，NoSQL多半是分布式的，当然memcached、Redis之类的产品或系统可以配成单机。 在数据库的教科书，DB、DBMS、DBM这几个概念是不同的。但是，我觉得这样不对。也许在当时，这种认知有一定的道理，但是，到了今天，层次结构已经成为系统设计的主要方法，所以，我们应该说，数据库是一个层次结构的系统，类似于我们把计算机系统划分为四个层次、把TCP/IP网络划分为五个层次，以及B/S系统的层次化设计办法。 从数据库软件及其应用的设计需求来看，应该满足数据管理、系统软件、资源管理、数据访问方法、计算处理、编程接口等。作为一个计算机系统，数据库同样采用分层设计，同样是一个四层结构的计算机系统。所以： 好象就这么多吧，如果数据结构、操作系统、离散数学、软件工程、计算机组成等几门基础课程功底好点，稍微点拨一下，然后就可以通过项目自学了。 好吧，数据库之所以难学，是因为写书的人、讲课的人、培训的人，都是稀里糊涂的。 --------------------------------------------------------------------------------------------- 1、一般数据库分为三~四门课程：数据库概论，数据库应用和数据库原理，外加一门数据库课程设计。不过，其它课程也很重要。 2、从整体上看，数据库是一种针对数据管理需求的特定的计算机系统。先要了解一下背景。有几个方面，一个数据管理的需要，一个是底层硬件的特性，一个是数据结构，一个是系统级软件的设计。事实上，数据库和数据结构，有另外一个相同的说法，数据的管理和处理。然后，数据库几乎总是在块设备（磁盘）上（即使是最近几年SSD比较便宜了，但是还是有大量的商用系统使用机械硬盘）。 3、数据库有两条路径，一个是从应用开始学，一个是从理论开始学。当然，最后应该能够把理论、应用结合起来，并且穿插学术研究和项目实践的历史发展及其背景。由于计算机系统的设计必然是透明的、虚拟的，所以从应用层开始学起，也没有问题。 4、从应用来看，数据库是为了满足是数据的统一管理的需求。为了满足这个要求，数据库必须向用户提供数据类型的定义方法、数据的操作方法、数据的一致性的保障。 5、从使用的角度来说，首先就是要掌握如何运用数据类型的定义方法、数据的操作方法来管理数据，并且在使用过程中，遵守一些必要的数据管理的规范。因此，根据项目，建立数据库、数据表、选择恰当的数据类型、遵守相关的规范。在这个过程中，掌握E-R图这个工具，对项目中的数据进行分析，即提取实体、实体的属性、实体的关系。 6、建库建表之后，就要掌握相关的数据操作方法和数据库内建的编程语言（存储过程），解决具体的问题。 7、由于数据是存储于外存中的（不考虑内存数据库），根据计算机组成原理，我们知道，外存I/O性能是系统瓶颈。在一个给定的外存设备的条件下，如何提高数据库的性能？所以，我们就要根据应用的特性，合理地进行设计。这个时候，就涉及到数据结构了。 8、我们知道，数据结构的存储结构，影响到数据操作的性能。对于外存中的数据，为了提高系统的性能，多采用索引结构，以加快数据项的定位。有的索引结构，写性能优于读性能，或者读性能优于写性能。因此，我们应该进行分析，哪一张表的哪一列应该建立什么样的索引。 9、在数据存在多张表的情况下，为了进一步提高系统的性能，我们还要推算数据表的多表操作时的I/O情况，依此优化数据表的索引设置。通常，我们分析多表操作中的关系演算过程，对多表操作的关系演算过程进行优化。 10、某些实际应用（事务处理）要求数据操作是原子性的（类似于操作系统的PV操作），所以，数据库必须支持事务处理的要求，要不所有的数据操作全部成功，要不所有的数据全部保持原始状态。 11、数据库应用基本上是多用户应用，所以，数据库必须支持并发性。按照操作系统，我们知道，数据也是一种资源。所以，必须对资源的访问进行控制，也就是资源锁和互斥锁。 12、当事务处理和并发控制结合在一起时，事情就变得复杂起来。再加上系统性能的考虑，也就有了悲观锁和乐观锁。 13、系统级软件，往往采用分层设计。同样地，数据库也采用分层设计理念，类似于计算机网络等其它信息系统。 （修改中） 14、再次强调一下，数据库，实际上就是一种特殊的数据结构。回忆一下，抽象数据类型，我们利用抽象数据类型描述现实世界中的数据，数据元素之间的关系，数据的操作。我们要给出抽象数据类型的逻辑结构和存储结构。 15、当然，由于数据库是分层设计，所以存储结构和逻辑结构是位于不同的层次。数据结构的逻辑结构对应了数据库的信息世界，数据结构的存储结构对应了数据库的机器世界。 16、对于CRUD，可谓是非常眼熟，数据结构的最常见的操作。 17、既然是一种数据结构，那么，数据库的操作也具有时间开销和空间开销。时间开销和空间开销，是数据库操作的时间复杂度和空间复杂度。 18、因此，即使作为一个普通的应用层开发人员，也应该对数据库的底层有所了解，以降低数据库操作的时间开销和空间开销。 19、SQL的设计理念，我记得知乎还是哪里有一个高手回答过。作为一门语言，有其哲学理念。理解其设计理念，有助于我们掌握这门语言。对于语言理解不深，就不抛砖引玉了。 20、在逻辑上，库-表-行-列-项，构成一种层次结构。数据库的数据，固然是一种数据结构，但是，为了进行管理，也设计了一种逻辑上的层次管理方法。有点象文件系统的层次结构——目录和文件结构，当然是在逻辑上的层面。比如库—表—行—列—项。每一种具体的数据库，它们的具体设计方案不同。 21、在分层设计中，有一种独有的概念，视图。视图是一种逻辑上的概念，是一种对表进行操作的结果。这个结果是一个虚拟的表，并不存在于物理存储空间。 22、在分层设计中，为了提高系统的性能，因此也设计了特定的cache方案。 23、数据库中的数据是一种资源，根据操作系统中的进程互斥和同步的原理，在并发访问时，就会因为同时访问资源而导致各种问题。 24、此外，从系统的角度来说，还应该提供安全。 25、对于优化，主要是指关系代数的优化，也就是尽可能减少时间开销和空间开销。 嗯。好象如果其它课程学得好，数据库也就这点东西了。