有没有针对bitemporal NoSQL数据库的设计模式?

10

我想知道是否有人在NoSQL平台上(例如riak)构建过任何基于双时间轴的数据库。

4个回答

2
我不知道有哪些 NoSQL 数据存储专门设计用于处理时间数据。 为了将有效期和交易时间段放入 Riak 中的数据中,你需要执行以下操作之一:
  1. 使用一个结构来包装你的文档/值,该结构可以保存元数据,例如:

    { meta:{ valid:["2001-11-08", "2001-11-09"], transaction:["2011-01-29 10:27:00", "2011-01-29 10:28:00"] } payload:"这是我想要存储的实际文档/值!" }

  2. 为每个文档创建一个“元文档”,并使用 Riak Links 将它们链接起来。
    我认为这种方法更加干净,但如果你需要经常检索这些时间,则此方法可能过慢。

如果你想按时间检索文档,那么我认为 Riak(或我所知道的任何其他键/值数据存储)都不是正确的数据存储系统。SQL 或可能是某个 BigTable 系统可能是你唯一的好选择。


1
我已经编写了一个基于Mongodb的小型双时态开源数据库层:

https://github.com/1123/bitemporaldb

在存储Scala或Java对象时,该对象会被包装成一个通用的双时间轴对象,并带有双时间轴元信息(有效时间,事务时间)。随后,它会被序列化为json并以BSON格式存储在MongoDB中。

它可以透明地处理对象的时间和非时间更新。通过双时间轴上下文进行搜索是可能的。

面向文档的数据库对于双时间轴数据非常有益,因为文档导向的存储减少了数据检索的连接数。在双时间轴上下文中,手动编写连接可能效率低下且难以实现。

欢迎提供反馈、贡献和功能请求。


1

为支持双重时间(或时间DB模型),您需要ACID事务来执行适当的DML以在两个时间维度(有效时间和事务/系统时间)上更新和插入记录。有关时间建模的详细信息,请参见此处

像Cassandra、MongoDB、Couchbase等流行的NoSQL数据库都没有ACID支持,无法执行必要的记录更新/插入操作以支持双重时间记录操作。使用时间和双重时间数据库时,记录不能重叠,并且必须在下一个有效/事务时间记录取代之后正确终止记录。

MarkLogic NoSQL数据库声称支持双重时间,但从未尝试过,并且不是开源的。但是您可以通过使用ACID数据库作为有效/事务时间跟踪日志并使用NoSQL作为实际数据存储器来自行解决方案。请参见此处的高级描述。


0

来自维基百科:

“双时间数据是在时间数据库中使用的一个概念。它表示数据的有效时间和事务时间。 在数据库表中,双时间数据通常由四个额外的表列StartVT和EndVT、StartTT和EndTT表示。每个时间间隔在其下限处关闭,在其上限处开放。”

所以你不能只将这四个值放到你的数据上吗?


1
添加这些元数据只是部分解决方案。需要自动管理这些元数据。考虑仅针对给定的有效时间(2015年)更新逻辑对象。然后,双时态数据库将确保在2015年之前和之后,原始值保持不变。它还允许使用双时态上下文进行查询:2013年我对逻辑ID为777的对象在2015年的状态了解到了什么? - user152468

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接