21

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

假设我需要对一个简单地址簿中的记录进行版本化。(地址簿记录存储为 ColumnFamily 中的行)。我希望历史:

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

我正在考虑以下方法:

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

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

    { '通讯录行键': { 'time stamp1': { 'first name': '新名字', '修改者': 'user id', },

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

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

  • 将版本存储为附加在新 ColumnFamily 中的序列化 (JSON) 对象。将版本集表示为行,将版本表示为列。(仿照使用 CouchDB 进行简单文档版本控制

4

2 回答 2

9

如果您可以添加地址簿通常包含少于 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 对应于这些版本的通讯簿的行键。这种方法的缺点是每次读取地址簿时都需要两次查询。好处是它可以让您有效地只阅读地址簿的选定部分。

于 2010-11-24T22:09:23.783 回答
1

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

于 2013-03-18T12:59:22.323 回答