如何自己实现一个关系型数据库

如何自己实现一个关系型数据库,第1张

先写一个并发控制子系统。里面要提供各种各样的闩锁。包括具有不同相容性矩阵的,有优先队列或者没有的,能指数后退或者不能的,全局可追踪的或者不可追踪的,等等等等。

后写一个存储管理子系统。在这里你可以决定你的数据库的外存布局。比如一个表可不可以分开几个文件存,有没有区的概念,有没有段的概念,有没有表空间的概

念,它们之中谁是定长的,谁是可变长的,谁是空间申请单位,谁是空间调度单位。决定好了开始设计页区段表空间格式,它们的描述符格式,然后用页头,页记

录,页尾有的没的串一起。设计好了开始决定这个子系统有哪些内存对象,至少要有一个存储管理器用来初始化,分配或者调度存储单元,至少还要提供一堆方法来

决定怎么把二进制数据变成有意义的数据,比如读一个ushort, 写一个uint64等等。

之后就要开始写一个缓冲区管理子系统(假设

你做的不是一个内存数据库)。先弄明白什么是一个block,一个page,

一个frame。这些都是你的类。然后写一个缓冲池,再写一个缓冲区管理器。缓冲池规定数据在内存上的布局,缓冲区管理器就是这个系统的接口了,可以回应

一个页的申请,并实现你最心仪的页替换策略。

再之后要写一个日志系统。先想好你是要用shadow

page日志啊,还是ARIES算法日志啊。假设用后者,于是你就失去了强制写,并采用偷帧的技术。这样你要设计redo日志的格式,并使你的日志记录种

类可扩展,因为不一定什么时候你就会需要一种新的日志记录。如果想让你的系统更稳健,看看需不需要组日志(一组日志记录要么都重做要么都不重做)。如果想

让你的系统更高效,看看需不需要mvcc。要的话还得再加入undo日志,并设计格式。下面你要设计日志记录粒度。全物理日志?全逻辑日志?物理逻辑日

志。总之,逻辑的成分越多,系统设计越复杂(比如糟糕的部分写怎么处理)。最后跟存储管理系统要个地方物化日志,再管缓冲区管理系统要个地方用来调度日志

页。

接下来要写一个锁系统。先想好你的系统是表级锁还是页级锁还是行级锁。前两个最自然,直接用fix

number什么的就搞定,最后一个你要有用来表示行锁的额外数据结构。每个行一个锁实例?每个页共用一坨锁实例?之后去这个锁表,用来统一申请释放锁。

最后再决定如何解决死锁,超时抛出异常?依赖图分析?

再接下来要写一个事务子系统。它无非就是提供了一些方法确保各种 *** 作正确地使用了二

阶段锁,正确地写了日志,正确地回滚。但是这个系统的架构由"各种 *** 作"的多样性决定。相比堆文件,对b+树组织的记录文件中记录的增删改查就要极大复杂

化日志写入过程。相比定长记录文件,对可变长记录的增删改查又是another story。

还有元数据管理子系统,记录(索引)子系

统。以上这些组成了一个存储引擎。题主还想要的额外的东西分别是: SQL lexer, SQL parser, SQL planner, SQL

optimizer。以上又构成了一个SQL compiler。 最后再来个Server/Client Module

用来控制权限,提供API,估计就差不多了。

1、连接到数据库,在“数据库”节点下面找到“DWDiagnostics”,点击展开,找到“数据库关系图”

2、右键点击“新建数据库关系图”

3、进入数据库关系图的设计界面

扩展资料:

1、对于任何数据库,都可以创建任意多个数据库关系图。

2、每个数据库表都可以出现在任意数量的关系图中。

3、这样,便可以创建不同的关系图是数据库的不同部分可视化,或强调设计的不同方面。

例如,可以创建一个大型关系图来显示所有表和列,并且可以创建一个较小的关系图来显示所有表但不显示列。

参考资料来源:百度百科——数据关系图


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6757313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存