Версионные таблицы в базе геоданных на PostgreSQL
Многопользовательская база данных должна обеспечить поддержку многим пользователям, одновременно создающим и обновляющим большие объемы географической информации. Поэтому база геоданных должна обеспечить среду редактирования, которая поддерживает многопользовательское одновременное редактирование без создания большого количества копий данных. Для обеспечения такой функциональности среда редактирования должна также поддерживать редактирование сеансов, продолжающиеся несколько дней, возможность отменять или повторять изменения, выполненные в базе данных, возможность тестирования и разработки моделей данных и предложения альтернативных проектов приложения без воздействия на опубликованную базу данных, а также функцию мониторинга развития данных и базы данных с течением времени.
Для выполнения данных требований, компания, рабочая группа и базы геоданных рабочего стола могут быть версионными. Для начала выполните регистрацию классов пространственных объектов, автономных классов объектов и таблиц как версионных объектов. Затем создайте версии баз геоданных, в которых вы будете выполнять редактирование. Данные версии являются виртуальными; копии базы геоданных не выполняются. Версии представляются дельта-таблицами, связанными с каждым версионным набором данных и несколькими системными таблицами, необходимыми для отслеживания версий.
Информацию о версиях см. в разделе Введение в версионное редактирование.
Версионные таблицы в ArcGIS for Desktop
В окне Каталога версионные наборы данных появляются аналогично неверсионным наборам. Проверить, является ли класс пространственного объекта или таблица версионной можно в диалоговом окне Свойства (Properties). В закладке Общие (General) указано, зарегистрирован ли данный касс пространственного объекта или таблица как версионные.
У вас может быть несколько версий базы геоданных. В каталоге вы можете выполнить подключение отдельных пространственных баз данных в каждую версию. При выполнении просмотра версионного набора данных в версии DEFAULT, он может выглядеть иначе, и содержать больше или меньше записей, чем тот же класс объекта, просмотренный с версией, отличной от DEFAULT. (Информацию о способах подключения пространственной базы данных к версии, отличной от DEFAULT, см. в разделе Подключение к определенной версии базы геоданных.)
Аналогично, при выполнении просмотра версионного класса пространственных объектов в одной версии ArcMap, а затем его просмотре в другой версии ArcMap, он может выглядеть иначе. Это происходит потому, что таблица класса пространственных объектов, просматриваемая в одной версии, содержит определенное число строк, а аналогичный класс объектов в другой версии может содержать другое число строк.
Для просмотра версии данных в документе карты щелкните кнопку По источникам (List By Source) в таблице содержания ArcMap.
При переключении на другую версию базы геоданных — версию wo2557 — класс пространственных объектов пожарные гидранты содержит дополнительный гидрант и объект lateral. Это означает, что гидрант был добавлен в класс объектов пожарные гидранты (Fire hydrants), а lateral в класс объектов Water laterals при редактировании с использованием версии базы геоданных wo2557.
Такое положение вещей наводит на мысль, что каждая версия создает отдельную копию данных. Однако, вместо создания новой копии или изменения исходных данных, база геоданных оставляет версионную таблицу или класс пространственного объекта в оригинальной форме, а любые изменения этих данных сохраняет в отдельных системных таблицах базы геоданных. Таблицы базы геоданных, фиксирующие изменения версии, являются дельта-таблицами. Для каждой таблицы или класса объектов, являющихся версионными, создаются две новые дельта-таблицы: таблица добавлений (a) и таблица удалений (b).
Версионные таблицы в базе данных PostgreSQL
В базе данных работа с версиями управляется несколькими таблицами базы данных — таблицами набора данных, дельта-таблицами и системными таблицами — для отслеживания версий.
Дельта-таблицы
Когда вы регистрируете набор классов, автономный набор классов или таблицу как версионные, в базе данных создаются две дельта-таблицы: таблица добавлений и таблица удалений. Дельта-таблицы хранят данные о вставках, обновлениях или удалениях, выполненных в версионной таблице или классе пространственных объектов, в каждом состоянии базы данных.
Только владелец набора данных может зарегистрировать его в качестве версионного.
a_<registration_id>
Таблица a<registration_id> (таблица добавлений) содержит информацию о каждой добавленной или обновленной записи (объекте) в версионной бизнес-таблице. Для определения добавленных или измененных записей в данном состоянии базы данных, к ней выполняется запрос. Значение registration_id в имени таблицы добавлений является значением в поле registration_id таблицы sde_table_registry, которая соответствует версионной таблице. На примере класса hydrants, registration_id класса объектов в таблице sde_table_registry равен 94; поэтому, таблица добавлений для класса объектов гидрантов называется a94.
Таблица добавлений содержит поля, аналогичные полям версионной бизнес-таблицы, подверженной редактированию, и поле col_stateid.
Имя поля |
Тип поля |
Описание |
Null? |
---|---|---|---|
<все поля из версионной бизнес-таблицы> |
<все соответствующие типы полей в версионной бизнес-таблице> |
Все атрибуты нового объекта |
|
sde_state_id |
bigint |
Идентификатор состояния, в котором был добавлен или изменен новый объект |
NOT NULL |
Например, если вы добавляете гидрант в класс объектов пожарных гидрантов (Fire hydrants) во время сеанса версионного редактирования, то для этого нового гидранта в таблицу добавлений вносится запись.
d<registration_id>
Таблица d<registration_id> (таблица удалений) поддерживает информацию о каждой удаленной или обновленной строки в версионной таблице, к ним выполняется запрос определения удаленных или измененных в определенном состоянии базы данных строках. При удалении строки запись не удаляется из базы данных; она помечается как удаленная и никогда не возвращается при последующих запросах к базе данных.
Имя поля |
Тип поля |
Описание |
Null? |
---|---|---|---|
sde_state_id |
bigint |
Идентификатор состояния, в котором был добавлен или изменен новый объект |
NOT NULL |
sde_deletes_row_id |
integer |
Уникальный идентификатор удаленного или обновленного объекта |
NOT NULL |
deleted_at |
bigint |
Состояние, в котором был удален объект |
NOT NULL |
Системные таблицы
Помимо дельта-таблиц, системные таблицы отслеживают версионные таблицы и редактирования. К ним относятся таблицы sde_states, sde_state_lineages, sde_versions и sde_mvtables_modified.
Версионные базы данных, помимо версии DEFAULT содержат, обычно, несколько версий. Эти дополнительные версии могут представлять такие элементы, как порядок работы, альтернативную конструкцию, сеанс автономного редактирования или исторические снимки. Таблица sde_versions содержит описание данных версий, каждая версия идентифицируется уникальным именем и ID (ID автоматически создаются ArcGIS). Кроме того, каждая версия имеет владельца, описание, родительскую версию, связанное состояние базы данных и уровень доступа пользователя.
При создании таблицы sde_versions в нее автоматически вносится подробная информация о версии DEFAULT. Администратор базы геоданных владеет версией DEFAULT, исходные ID соответствующего состояния базы данных равны 0. Далее приведен пример поля DEFAULT в таблице sde_versions:
Имя |
Владелец |
Version_ID |
Статус |
State_ID |
Описание |
Parent_name |
Parent_owner |
Parent_version_ID |
Creation_time |
---|---|---|---|---|---|---|---|---|---|
DEFAULT |
SDE |
1 |
1 |
0 |
Версия экземпляра по умолчанию |
NULL |
NULL |
NULL |
2009-02-12 08:40:26 |
Для управления редактированием данных, версионные базы геоданных содержат коллекцию состояний базы данных или единицы изменения в базе данных. Состояние представляет собой дискретный снимок базы данных при каждом внесении в нее изменения: каждая операция редактирования создает новое состояние базы данных. (Операцией редактирования является любая задача или набор задач [добавления, удаления или изменения], выполненные над объектами и строками.) Все версии базы геоданных ссылаются на одно из таких состояний базы данных и изменяются, с течением времени, последовательностью состояний.
Все состояния базы геоданных имеют одну схему и отличаются только числом строк, представляющих каждую измененную таблицу или класс пространственных объектов. Для определения конфликтов, которые могут произойти в процессе редактирования одного класса объектов в данной или других версиях, выполняется сравнение состояний версий на разности или конфликты строк во время согласования версии.
Вся информация, относящаяся к состояниям, управляется в таблице sde_states. Для определения состояния базы данных, ссылающихся на каждую версию, выполняется запрос таблиц sde_versions и sde_state_lineages.
Состояния поддерживаются в структуре дерева, которая позволяет вывести из истории состояний отношения родительская-дочерняя запись. Информация о происхождении состояния для каждой версии поддерживается в отдельной таблице sde_state_lineages. Данная таблица содержит индекс множественного элемента для переноса отношений состояния родительское-дочернее, и используется для запросов всех версий.
Для возврата правильного вида версии выполняется запрос происхождения состояния, которое фиксирует все изменения, внесенные в версию. Из данного перечня состояний можно определить строки таблицы, которые правильно представляют версию. Так как со временем база геоданных редактируется, а версии изменяют, то дерево состояний усложняется.
При каждом изменении класса объектов или таблицы в состоянии создается новая запись в таблице sde_mvtables_modified. При согласовании двух версий первым шагом процесса является идентификация состояний, на которые ссылаются эти версии – состояние текущей версии редактирования и состояние целевой версии. На основании данных состояний выводится общий предок состояния – это происходит в процессе обратного отслеживания происхождения состояний двух версий. Затем происходит запрос таблицы sde_mvtables_modified для идентификации всех таблиц, которые были изменены между состоянием общего предка и состоянием целевой версии. Из полученного перечня измененных таблиц создается второй перечень таблиц, которые являются общими для обоих состояний. Для всех общих таблиц из второго списка выполняется несколько запросов на разность версий — INSERT, UPDATE, DELETE, UPDATE_UPDATE и UPDATE_DELETE.
Таблицы, участвующие в присвоении версии классу пространственных объектов, можно увидеть на следующей схеме:
Штриховые линии определяют неявные отношения между столбцами.
Номер в имени таблиц добавления и удаления соответствует registration_id бизнес-таблицы из таблицы sde_table_registry.
Версионные таблицы в XML-документе рабочей области
Поле в XML-документе указывает, являются ли данный класс пространственного объекта или таблица версионными. Он сопровождается тегами версий. Для версионного класса объектов или таблицы значение данного параметра равно true.
Тег версии, несмотря на то, что он задан в наборах классов, не обязательно отражает значение версии классов объектов в них Для определения, являются ли классы объектов набора классов версионными, выполните запрос отдельного класса пространственных объектов.
<Versioned>true</Versioned>