我正在研究最适合实现一个简单的开源对象时间数据库的数据结构,并且目前我非常喜欢使用Persistent Red-Black树来实现。
我使用持久化数据结构的主要原因首先是为了尽量减少锁的使用,以便使数据库能够尽可能地并行。此外,这将更容易实现ACID事务,甚至可以抽象出数据库以在某种类型的集群上并行工作。 这种方法的好处是可以几乎免费地实现时间数据库。而且这对于Web和数据分析(例如趋势)来说特别有用。
所有这些都很酷,但我有一点怀疑使用持久化数据结构在磁盘上的整体性能。即使今天有一些非常快速的硬盘可用,而且所有写操作都可以异步完成,因此响应总是立即的,我也不想建立在错误的前提下构建整个应用程序,只会意识到这并不是真正好的方法。
这是我的思路: - 由于所有写入操作都是异步执行的,并且使用持久化数据结构将使之前——当前有效的——结构无效,因此写入时 间并不是真正的瓶颈。
有一些关于像这个这样的结构的文献,它们专门用于磁盘使用。但是我认为这些技术会增加更多的读取开销以实现更快的写入。但我认为恰恰相反是可取的。此外,许多这些技术确实最终会产生多版本树,但它们并不是严格不变的,这是证明持久开销的关键因素。我知道在向数据库附加值时仍然需要某种形式的锁定,并且如果不维护所有版本,则应该有良好的垃圾收集逻辑(否则文件大小肯定会大幅上升)。还可以考虑增量压缩系统。
在所有搜索树结构中,我真的认为红黑树是最接近我所需的,因为它们提供了最少的旋转。
但是这条路上可能会有一些潜在的陷阱: - 异步写入可能会影响需要实时使用数据的应用程序。但我认为这通常不适用于Web应用程序。此外,当需要实时数据时,可以设计其他解决方案,例如需要以更实时方式处理的特定数据的签入/签出系统。 - 它们也可能导致一些提交冲突,尽管我无法想到何时会发生。另外,如果两个线程正在使用相同的数据,则普通RDBMS中也可能会发生提交冲突,对吗? - 具有这样的不变接口的开销将呈指数增长,一切都注定要很快失败,所以这一切都是个坏主意。
任何想法吗?谢谢!
编辑: 似乎有人误解了什么是持久化数据结构: http://en.wikipedia.org/wiki/Persistent_data_structure