Основы системы ревизий в стиле CouchDB, делающие базу данных уникальной (часть 3 из 10)

В первой части этой серии мы рассмотрели Cloudant JSON, а во второй части мы увидели, как создается _id. В этой части мы сосредоточимся на скромном токене _rev.

Когда вы впервые создаете документ, вам не нужно беспокоиться о токене _rev - он создается для вас и возвращается вам в квитанции.

Если мы создаем новый документ с телом {"a":1,"b":2}, мы получим ответ из базы данных:

Мы можем увидеть _id и _rev, если получим документ:

Поля, начинающиеся с символа подчеркивания _, зарезервированы для конкретных целей Cloudant. Например, вы не можете добавить собственное поле _name.

Что такое токен _rev?

Маркер _rev состоит из двух частей, разделенных знаком дефиса -:

  • число, которое увеличивается с каждой версией документа
  • 32-символьная строка, которая является криптографическим хешем тела документа.

Почему у Cloudant есть токен _rev?

Маркер _rev отслеживает изменения, которые документ проходит в течение своей жизни:

  1. Первая редакция 1–25f9b97d75a648d1fcd23f0a73d2776e
  2. Вторая редакция 2–524e981baaeec9bbecf92c4c01242308
  3. Третья редакция 3-e95ca5ca4dc5407fd09b8e0e0acf25fd

Cloudant фактически хранит изменения в древовидной структуре данных, простейшей формой которой является постоянно растущий список изменений:

Когда мы говорим о конфликтах, все может быть намного сложнее, но это уже в другой раз.

Что касается того, почему данные хранятся таким образом, это связано с тем, что Cloudant был создан для работы в качестве распределенной базы данных с данными, хранящимися на многих узлах в кластере. Распределенные системы сложны, и дерево ревизий позволяет базе данных обрабатывать конфликтующие записи без потери данных, подобно тому, как Git не потеряет данные при конфликтующем слиянии. Дерево ревизий также важно при репликации данных из одного места в другое. Две базы данных в любом состоянии могут быть реплицированы в любом направлении без потери данных благодаря дереву ревизий.

Могу ли я использовать дерево редакций в качестве системы контроля версий для моих документов?

No.

Cloudant не сохраняет тела старых ревизий (они уничтожаются в процессе, называемом «уплотнением»), но история ревизий токенов сохраняется.

При удалении документа создается еще одна редакция

Документ Cloudant никогда не может быть удален. Когда вы выполняете вызов API удаления, в конец дерева добавляется еще одна ревизия:

  1. Первая редакция 1–25f9b97d75a648d1fcd23f0a73d2776e
  2. Вторая редакция 2–524e981baaeec9bbecf92c4c01242308
  3. Третья редакция 3-e95ca5ca4dc5407fd09b8e0e0acf25fd
  4. Четвертая редакция 4-d0b8f4e0375c952eb957de7dc1947aef

Последняя ревизия будет выглядеть так:

При удалении документа эта последняя ревизия и дерево маркеров ревизий остаются позади.

Меня не волнуют токены ревизии - уберите их

На самом деле вы не можете удалить токены ревизии, но есть библиотеки, предназначенные для новичков, которые скрывают их от вас, чтобы вы могли продолжить создание своего приложения. Взгляните на cloudant-quickstart, который делает именно это.

Даже если вы затыкаете уши и делаете вид, что токенов ревизий не существует, они все равно записываются в базу данных, поэтому вам следует стараться избегать изменения одного и того же документа снова и снова, если это возможно, и имейте в виду, что удаленный документ оставляет часть данных позади.

В следующий раз

В следующей части мы рассмотрим использование HTTP API Cloudant с помощью curl инструмента командной строки.