在Cassandra实施数据版本的方法
-
10-10-2019 - |
题
您能否分享您的想法,如何在Cassandra中实施数据版本。
假设我需要在简单的通讯簿中版本记录。 (地址簿记录在列中存储为行)。我希望历史:
- 很少使用
- 将立即使用以“时间机”方式展示它
- 单个记录的版本不会超过几百个版本。
- 历史不会到期。
我正在考虑以下方法:
将通讯录转换为超级列家族,并将多个版本的通讯录记录存储在一行键入(按时间戳记)中,为超级列。
创建新的超级专栏族来存储旧记录或更改记录。这种结构看起来如下:
{'通讯簿行键':{'time stamp1':{'''':'new name','由':':'user id'修改,},},
'time stamp2': { 'first name': 'new name', 'modified by': 'user id', }, },
“另一个通讯录行键”:{'time stamp':{....
将版本作为序列化(JSON)对象附加在新columnfamilly中。将版本集表示为行和版本为列。 (以后建模 与Couchdb的简单文档版本控制)
解决方案
如果您可以添加以下假设:地址簿中通常有少于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对应于地址簿的那些版本的行键。这种方法的缺点是,每次阅读地址簿时,它都需要两个查询。好处是,它使您只能有效阅读地址簿的一部分。
其他提示
HBase(http://hbase.apache.org/)内置了此功能。尝试一下。