这是一个比较空的面试题,这里说一下如何回答。

如何设计一个关系型数据库

我们考虑开发一个数据库最重要的模块是什么。首先数据存储是其核心功能。因此会有一个存储模块来存储数据。介质主要是硬盘。

可是,光有存储是不行的。我们需要有以下程序模块对数据进行组织。

  • 存储管理

我们需要对数据的格式和文件的分隔进行统一的管理,通过逻辑的形式来组合和表示出来。

我们知道程序处理,需要将数据先加载到内存中去,不可能直接在硬盘上进行处理。

我们通过io读取磁盘数据,磁盘的io是非常耗时的,所以硬盘以页的形式存储数据,根据局部性原理,往往用户要查询的数据周围的数据也会被查询到,所以取数据都是以页为单位查取多个数据,提高效率。

  • 缓存机制

也就是上面提到的,一次IO不会只取用户所需要的一点数据,所以会涉及到缓存,缓存可能会不够放,那就涉及一些缓存淘汰的算法,比如比较常用的是LRU算法。

  • SQL解析

将SQL进行编译执行。如何提高SQL解析效率呢?可能也用缓存,缓存好SQL解析后的结果,下次再执行一样的SQL就可以免去解析的过程。

  • 日志管理

要记录SQL操作,方便主从同步、灾难恢复等。这里要了解一下binlog.

  • 权限划分

就是权限。

  • 容灾机制

要对异常情况做好准备,比如数据库挂了怎么办。

  • 索引管理

优化数据库执行效率。

  • 锁模块

使得数据库支持并发操作。

总结

了解了上面的内容,我们就可以对这个问题做一个简单的总结性回答了,如何设计关系型数据库呢?首先数据库有一个存储的功能,使得它能存储在比如机械硬盘或者固态硬盘上面。其次,我们需要一个存储管理模块来映射程序逻辑与物理地址,实现存储管理。还需要缓存机制,对一些数据进行缓存提高效率,并且缓存不能太大,必须配备缓存淘汰机制;然后需要一个SQL解析模块,来解析SQL;然后需要日志管理来提供主从赋值、主从同步等功能;还需要一个权限划分模块,来提供给多用户使用场景;还需要容灾机制面对异常情况;最后,为了提高数据查询效率需要有索引管理模块;为了支持并发操作需要有锁模块。