2010-11-15 81 views
18

您可以分享您的想法如何在Cassandra中实现数据版本化。在Cassandra中实现数据版本化的方法

假设我需要在简单的地址簿中记录版本记录。 (地址簿记录作为行存储在ColumnFamily中)。 我想到的是,历史:

  • 将不常使用的
  • 将用于一次全部呈现它的“时间机器”时尚
  • 不会有更多的版本比几百到一个记录。
  • 历史记录不会过期。

我考虑了以下方法:

  • 转换通讯录超级柱族在键入一个行存储的地址簿中记录的多个版本(通过时间戳)作为超级列。

  • 创建新的超级柱族来存储旧记录或更改记录。 这样的结构将如下所示:

    { '地址簿行密钥':{ 的时间stamp1“:{ '名字': '新名字', '改良': '用户ID' , },

    'time stamp2': { 
         'first name': 'new name', 
         'modified by': 'user id', 
        }, 
    }, 
    

    '其他通讯录行密钥':{ '时间戳':{ ....

  • 商店版本系列化(JSON)对象附着在新山口umnFamilly。将版本集作为行和版本表示为列。 (Simple Document Versioning with CouchDB蓝本)

回答

8

如果你可以添加地址簿通常他们有少于10,000个条目,然后利用每地址簿时行一个行的超级列族将是一个不错的方法的假设。

一排看起来像:

{'address_book_18f3a8': 
    {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}}, 
    {1290636018401680: {'entry1': 'entry1_stuff_v2', ...}, 
    ... 
} 

其中行键标识地址簿,每个超级列名是一个时间戳,和子列表示地址簿的内容,该版本。

这将允许您仅使用一个查询来读取地址簿的最新版本,并且还可以使用单个插入来编写新版本。

如果地址簿少于10,000个元素,我建议使用此功能的原因是,即使只读取一个子列,超级列也必须完全反序列化。总的来说,在这种情况下并不是那么糟糕,但应该记住这一点。

另一种方法是使用单排每地址簿的版本,并使用单独的CF与时间线行每地址簿,如:

{'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}} 

这里,some_uuid1和some_uuid2对应这些地址簿版本的行密钥。这种方法的缺点是每次读取地址簿时都需要两次查询。好处是,它可以让你有效地阅读通讯录中的选定部分。

+0

感谢您指出您始终需要阅读整个超柱。我没有发现阅读cassandra文档的事实。 – 2010-11-27 10:09:34

1

HBase(http://hbase.apache.org/)内置此功能。 试试看。

+3

您是否指hbase(http://hbase.apache.org/book/versions.html)中的“版本”?链接到您所指向的功能的实际文档将很有帮助。 – 2014-10-07 22:28:11

相关问题