Ответ 1
Если вы можете добавить предположение, что адресные книги обычно имеют менее 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 соответствуют ключу строки для этих версий адресной книги. Недостатком этого подхода является то, что он требует два запроса каждый раз, когда адресная книга читается. Положительным моментом является то, что он позволяет вам эффективно читать только отдельные части адресной книги.