您能否分享一下您如何在Cassandra中实现数据版本控制的想法。
假设我需要在简单的地址簿中对记录进行版本控制。 (地址簿记录存储为ColumnFamily中的行)。 我期待历史:
我正在考虑以下方法:
将地址簿转换为超级列族,并将多个版本的地址簿记录存储在一行中(按时间戳记)作为超级列。
创建新的超级列族以存储旧记录或更改记录。 这种结构如下:
{ '地址簿行密钥':{ 'time stamp1':{ '名字':'新名字', '修改者':'用户ID', },
'time stamp2': {
'first name': 'new name',
'modified by': 'user id',
},
},
'另一个地址簿行键':{ '时间戳':{ ....
将版本存储为新ColumnFamilly中附加的序列化(JSON)对象。将版本集表示为行,将版本表示为列。 (模仿Simple Document Versioning with CouchDB)
答案 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/)内置了此功能。 试一试。