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

Pio*_*pla 20 database-versioning cassandra

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

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

  • 将很少使用
  • 将一次性使用以"时间机器"的方式呈现它
  • 单个记录的版本不会超过几百个.
  • 历史不会过期.

我正在考虑以下方法:

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

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

    {'地址簿行键':{'时间戳1':{'名字':'新名称','由'修改':'用户ID',},

    'time stamp2': {
            'first name': 'new name',
            'modified by': 'user id',
        },
    },
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 将版本存储为新ColumnFamilly中附加的序列化(JSON)对象.将版本集表示为行,将版本表示为列.(使用CouchDB进行简单文档版本控制后建模)

Tyl*_*bbs 9

如果您可以添加地址簿通常少于10,000个条目的假设,那么在超级列族中每个地址簿时间线使用一行将是一个不错的方法.

一行看起来像:

{'address_book_18f3a8':
  {1290635938721704: {'entry1': 'entry1_stuff', 'entry2': 'entry2_stuff'}},
  {1290636018401680: {'entry1': 'entry1_stuff_v2', ...},
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

这将允许您使用只有一个查询阅读最新版本的地址簿中,并与单个插入写一个新的版本.

如果地址簿少于10,000个元素,我建议使用它的原因是,当您读取单个子列时,必须完全反序列化超级列.总的来说,在这种情况下并没有那么糟糕,但要记住这一点.

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

{'address_book_18f3a8': {1290635938721704: some_uuid1, 1290636018401680: some_uuid2...}}
Run Code Online (Sandbox Code Playgroud)

这里,some_uuid1和some_uuid2对应于那些版本的地址簿的行键.这种方法的缺点是每次读取地址簿时都需要两个查询.好处是它可以让您有效地只读取地址簿的选定部分.