透明持久性允许您使用常规对象而不是数据库。对象会自动从磁盘读取和写入磁盘。此类系统的示例是 Gemstone 和 Rucksack(用于 common lisp)。
他们所做的简化版本:如果您访问foo.bar
并且 bar 不在内存中,它将从磁盘加载。如果您这样做,foo.bar = baz
则该foo
对象将在磁盘上更新。大多数系统还具有某种形式的事务,它们可能支持跨程序甚至跨网络共享对象。
我的问题是实现这类系统的不同技术是什么,这些实现方法之间的权衡是什么?
透明持久性允许您使用常规对象而不是数据库。对象会自动从磁盘读取和写入磁盘。此类系统的示例是 Gemstone 和 Rucksack(用于 common lisp)。
他们所做的简化版本:如果您访问foo.bar
并且 bar 不在内存中,它将从磁盘加载。如果您这样做,foo.bar = baz
则该foo
对象将在磁盘上更新。大多数系统还具有某种形式的事务,它们可能支持跨程序甚至跨网络共享对象。
我的问题是实现这类系统的不同技术是什么,这些实现方法之间的权衡是什么?
我在几个项目中使用过这样的系统(ObjectStore),最显着的是一个商业信用风险系统,以及一个优化石油管道网络流量的系统。关于实现的问题在这里讨论太复杂了,但至于此类系统和关系数据库之间的权衡:
对象数据库优势:
非常非常快 - 对于某些查询,它们可能比关系数据库快 100 到 1000 倍。事实上,我设计的风险系统(根据 Sybase 自己的说法)无法在 SQL 数据库上实现。
非常容易与 C++ 代码集成 - 无需阻抗匹配层。
可用于基本 CRUD 应用程序的 GUI 库数量有限
关系优势:
即席查询比对象数据库更容易和更快。
大约一百万个工具来管理数据库
非常容易创建 GUI 应用程序
很多人都有 RDBMS 经验
但是,当然,与所有工具一样,您不必选择其中一种。我编写的风险应用程序从 Sybase 数据库导入数据,从 Oracle 导入管道。