【译】如何构建一个数据库

问题

如何构建一个数据库?

回答

这是一个好问题,值得写一个长回答。

    大多数的数据库服务是用C语言构建的,一般使用B树这种数据结构来存储数据。以前有种东西叫C-ISAM(一种提供顺序索引存取方法的C语言库),这是一种低等级的库,用来帮助C程序员使用B树的格式写入数据。所以,你需要知道和理解B树以及以上这些内容。

    大部分数据库存储数据的索引是分离的。试假设,你向一个文件中写入五条记录(行),一条记录有800字节。每行包括姓、名、住址等等的列。现在你想通过姓氏查找一条特定的记录,你可以打开这个文件,然后顺序地查找每一条记录,但这样做是很慢的。你也可以打开一个索引文件,这个文件里只包含姓氏和对应姓氏的记录在数据文件中的位置。于是,当你得到这个位置,你就可以打开数据文件,直接定位到这个位置并读取数据。因为索引的数据量是很小的,所以查找索引文件比直接顺序查找快很多。进一步讲,如果索引文件是使用B树存储的,就可以对你要查找的记录进行非常高效的快速查找(使用分治的思想)。

    所以不难理解,对于每一张数据表(table),都会有一个数据文件(用来存储数据),和一个(或多个)索引文件。比如说,第一个索引文件可以是对姓氏进行索引,下一个索引文件可以用来对社保号码进行查找,等等。当用户查找数据时,也就同时决定了使用哪张表来进行查找。如果你会使用C-ISAM(也有一个开源版本,或者说便宜的版本,叫做D-ISAM)查找信息,你就可以很好的理解这个概念。

    使用ISAM,你可以从现有的数据记录和索引文件中通过值来获取记录,以及添加一条新记录。然而,现代的数据库服务几乎都支持SQL语言,所以你需要一个SQL解释器,来把SQL语句解释成相关操作的序列。SQL可能联结两张表,所以还需要一个控制器来决定首先读取哪张表(一般基于每张表的行数和索引有效性)和如何将它与下一张表相关联。SQL可以插入(INSERT)数据,所以你需要把这种操作解释成添加(PUT)语句。但是,SQL也可以组合多个插入操作到事务(transaction)中,所以还需要一个事务管理器(transaction manager)来控制这种操作。同样,也需要事务日志(transaction logs)来存储失败/成功的事务。

    你可能会需要一些备份/恢复命令来备份你的数据文件、索引文件和你的事务日志文件,如果你真的打算实现这些,你可以写一些复制工具来读取你的事务日志,然后把这些事务复制到一个位于另一台服务器上的备份数据库。记得,如果你想让你的客户端程序(比如,一个类似phpmyadmin的SQL图形用户界面)运行在不同的设备,而不是你的数据库服务器上,你需要写一个连接管理器(connnection manager)来通过TCP/IP发送SQL请求到你的服务器上,再通过一些证书验证这些请求的合法性,然后解释这些请求并运行你的数据查询操作,最后把查询到的数据发回客户端。

    所以实现这些数据库服务的工作量可能会特别大,尤其是对于一个人来讲。但是你可以每次只创建这些工具的简单版本。从如何存储数据并建立索引开始,然后再研究如何使用ISAM类型的接口检索数据。

    有一些建议:查阅关于mysql和msql的经典书籍,使用google搜索任何有关B树和ISAM的资料,寻找已经比较完善的ISAM的C语言开源库。对于Linux下的C语言的文件读写要有比较好的理解。很多商业的数据库系统现在甚至不使用文件系统来管理他们自己的数据文件,因为高速缓存的出现,让他们可以直接对原生的磁盘进行写入。你一开始只需要写入文件就可以了。

    希望这个回答可以帮上一点忙。

原文链接

http://www.reddit.com/r/Database/comments/27u6dy/how_do_you_build_a_database/ciggal8

参考文献

[1] Forta B , 钟鸣, 刘晓霞译. SQL必知必会[M]. 原书第四版. 人民邮电出版社, 2013.5.

[2] Silberschatz A, FKorth H, S.Sudarshan,杨冬青,李红燕,唐世渭等译. 数据库系统概念[M]. 原书第六版. 机械工业出版社, 2014.11.

吃桔子的攻城狮

修炼ing……

在 “【译】如何构建一个数据库” 上有 3 条评论

发表评论