在Cassandra中实现数据版本控制的方法

时间:2010-11-15 11:37:51

标签: cassandra database-versioning

您能否分享一下您如何在Cassandra中实现数据版本控制的想法。

假设我需要在简单的地址簿中对记录进行版本控制。 (地址簿记录存储为ColumnFamily中的行)。 我期待历史:

  • 将不经常使用
  • 将一次性使用,以“时间机器”的方式呈现它
  • 单个记录的版本不会超过几百个。
  • 历史不会过期。

我正在考虑以下方法:

  • 将地址簿转换为超级列族,并将多个版本的地址簿记录存储在一行中(按时间戳记)作为超级列。

  • 创建新的超级列族以存储旧记录或更改记录。 这种结构如下:

    {  '地址簿行密钥':{     'time stamp1':{             '名字':'新名字',             '修改者':'用户ID',         },

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

    '另一个地址簿行键':{     '时间戳':{     ....

  • 将版本存储为新ColumnFamilly中附加的序列化(JSON)对象。将版本集表示为行,将版本表示为列。 (模仿Simple Document Versioning with CouchDB

2 个答案:

答案 0 :(得分: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对应于那些版本的地址簿的行键。这种方法的缺点是每次读取地址簿时都需要两个查询。好处是它可以让您有效地只读取地址簿的选定部分。

答案 1 :(得分:1)

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