出于教育原因,我希望建立一个功能齐全的关系数据库。我知道LMDB曾经是存储backend of sqlite,但我不知道C.我在.NET上,我对复制“传统”RDBMS不感兴趣(例如, ,我不担心实现一个sql解析器,而是我自己构建的自定义脚本语言,但是暴露了完整的关系模型。
考虑这个类似于“如何在LLVM之上实现编程语言”的问题,然后再担心为什么我没有使用sqlite或类似的。
从material I read开始,LMDB看起来很棒,特别是因为它提供了事务和可靠性,以及低级管道。如何转换为可能触及多个表中多行的更改是另一个问题..
现有材料解释了如何在LMDB之类的东西上实现关系层?是使用LMDB(或其竞争对手)最佳还是存在另一种更好的方法来获得结果?
是否可以使用LMDB存储其他结构,如哈希表,数组和(我对列式数据库更感兴趣的那个)位图数组?,即类似于redis?
P.D:存在一个论坛或其他地方来讨论这个主题吗?
答案 0 :(得分:0)
我也有这个想法。你应该意识到这是大量的工作,很可能没有人会关心。我没有建立完整的关系数据库,因为这对一个人来说是疯狂的。你可以查看here
无论如何我使用了leveldb(以及后来的rocksdb),因此你有按键排序的键值,按键获取值的能力,迭代键,具有许多值的原子写入(WriteBatch)以及数据的一致视图给定时间 - 快照。这些功能足以构建正确的线程安全读取表行(使用快照),正确写入数据和相关索引 - 全部或全部(使用writebatch)甚至事务。
每个列都有磁盘索引 - 键按值排序 - 因此您可以有效地对其进行各种操作,并使用值本身的键,这样您就可以有效地读取给定id的值。
这种设置对于使用少量数据(比如少于一百万行)的表上的可用操作进行写入和读取是有效的。但是,如果表增长迭代,许多键可能会变得不那么快。为了解决这个问题并添加group-by语句,我决定添加内存索引,但这是另一个故事。总而言之,这可能是一个有趣的想法,但实际上很多工作和经常令人沮丧的结果 - 你为什么要这样做?