Разработка моментальных снимков в транзакционной базе данных вместе с управлением версиями эталонных данных.

Отказ от ответственности: я прочитал все, что мог прочитать по теме моментальных снимков и управления версиями как о переполнении стека, так и в Интернете. Моим требованием является не отслеживание версий для контрольного журнала или моментальных снимков на уровне базы данных. Я потратил более 1 недели на самостоятельное исследование и обдумывание возможных вариантов. Извините, я мог пропустить некоторые ссылки - если решение моей проблемы уже обсуждалось в какой-то другой теме, пожалуйста, ткните меня туда.

Это немного долго; пожалуйста, потерпите меня.

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

В рамках бизнес-процесса пользователь может нажать кнопку, чтобы опубликовать определенный объект. Для иллюстрации предположим, что пользователь может опубликовать предложение поставщика до начала переговоров. Затем в разные моменты времени в процессе переговоров пользователь может опубликовать данные предложения. Предложение содержит бюджет, цели продаж и многие другие пункты. При создании моментального снимка предложения необходимо сделать снимок всех связанных объектов. Наконец, после переговоров подписывается контракт. На этом этапе необходимо создать полный снимок контракта. Не все объекты контракта присутствуют в предложении — есть много дублирующих друг друга объектов, но есть уникальные объекты, прикрепленные к предложению и контракту.

Мы должны поддерживать доступ как к этим опубликованным версиям, так и к последним активным версиям. Опубликованные версии доступны на веб-сайте, на который могут ссылаться как поставщики, так и команда менеджеров. Не все опубликованные версии доступны на веб-сайте, но последнее опубликованное предложение и последний опубликованный контракт всегда доступны на веб-сайте. Этот веб-сайт также должен быть заполнен из той же базы данных.

Кроме того, финансовый пользователь может решить сделать снимок только бюджета, а менеджер по продажам может сделать снимок целей продаж. Таким образом, моментальные снимки доступны с разной степенью детализации.

У нас также есть требование отслеживать версии основных данных. Отслеживание всех изменений в ключевых столбцах основных данных с течением времени является бизнес-требованием. Например, у нас есть информация о регионе, связанная с планами продаж. Название региона может измениться, и мы хотим отслеживать эти изменения. Предположим, что на момент предложения имя региона — R1 и создан снимок. Затем имя региона меняется на R2 и создаются 2 других снимка. Мы хотим иметь возможность связать цели продаж с правильным названием региона в эти моменты времени, а не обязательно с последним названием региона.

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

Вот наш дизайн. У нас есть таблица «Публикация», в которой содержится основная информация об опубликованных данных: кто опубликовал, дата, причина и тип опубликованного объекта (предложение, бюджет или цели продаж).

Мы храним снимки в той же таблице, что и исходные данные. Таким образом, снимки предложений будут храниться вместе с текущими предложениями в таблице предложений. У нас есть столбец с именем Publication ID в каждой таблице, которая должна быть опубликована. Этот столбец является FK для таблицы Publication. Если идентификатор публикации равен нулю, эта запись является активной версией.

Я понял, что пост очень длинный. Следовательно, вместо того, чтобы перечислять детали сценария, я решил быстро обобщить соображения дизайна в интеллект-карте. Соображения по созданию снимков

Теперь есть 2 решения, к которым мы склоняемся: оба сохранят моментальный снимок всех данных независимо от того, изменились они или нет. Сохранение только дельты при сохранении неповрежденной структуры таблиц потребовало бы очень сложной хранимой процедуры, которая должна запускаться при каждой вставке/обновлении любого объекта моментального снимка. Я не хочу идти по этому пути, так как это займет больше времени, а объемы все равно не такие уж большие.

Решение 1. Каждый раз, когда публикуется объект (например, предложение или бюджет), мы заполняем XML-дерево и сохраняем его в базе данных. На веб-сайте должна быть доступна только последняя версия, а старые версии нужны редко. Учитывая это, могу ли я столкнуться с большой проблемой производительности из-за использования XML? Мы используем SQL Server. Объемы данных невелики.

Решение 2. Все таблицы транзакций будут иметь идентификатор публикации, а справочные данные — даты начала и окончания. Всякий раз, когда объект публикуется, мы делаем копию всех записей транзакций и помещаем туда идентификатор публикации, а также копируем все записи эталонных данных и ставим дату снимка в качестве конечной даты. Это позволило бы нам иметь нормальное управление версиями для справочных данных вне процесса публикации.

Мне нужны мнения опытных умов относительно недостатков этих двух подходов и есть ли какой-либо другой лучший сценарий.


person Siraj Samsudeen    schedule 22.03.2011    source источник
comment
Интересно, смотрели ли вы временные базы данных.   -  person Angelom    schedule 04.04.2011
comment
Несколько вопросов: есть ли в вашем хранилище данных какие-либо измерения на основе времени/календаря? Требуется ли, чтобы ваши моментальные снимки хранились в той же таблице, что и исходные данные?   -  person Chris Walton    schedule 13.04.2011
comment
Привет, Крис, да, схема DW (которая отделена от схемы, которую мы разрабатываем для транзакционной БД) имеет измерение времени. Нет необходимости хранить его в той же таблице — мы можем принять решение, исходя из того, что работает лучше всего.   -  person Siraj Samsudeen    schedule 13.04.2011
comment
Привет, Ангелом, я кратко рассмотрел временные базы данных. Это казалось научным предметом с большим количеством исследований. Я просмотрел ссылки из сообщения stackoverflow, относящиеся к временным базам данных.   -  person Siraj Samsudeen    schedule 13.04.2011


Ответы (1)


Мой подход состоял бы в том, чтобы выбрать решение 2. Принимая во внимание ваши соображения по порядку:

  1. Я бы сохранил копию всего в снимке. Если вы сохраните только изменение, вы столкнетесь с проблемой моментального снимка деталей процесса, чтобы получить желаемый снимок из изменений. Поначалу это не проблема, но по мере изменения схем, программ и процессов вам придется сохранять сведения о том, как получить желаемый моментальный снимок из процесса, который сам изменился. Выполнимо, но потенциально хрупко.

  2. Я бы выбрал вариант, не упомянутый на вашей диаграмме, хотя и набросанный в вашем описании решения 2. Здесь используется схема, очень похожая на схему базы данных транзакций, но расширенная для включения информации, характерной для моментальных снимков. Вы указываете идентификатор публикации в качестве внешнего ключа и даты для справочных данных. Вам может понадобиться дополнительная информация, такая как даты, связанные с данными транзакции.

  3. Та же схема не годится — вы указали (идентификатор публикации), что та же самая схема неадекватна. Ничто из того, что вы публикуете, не предполагает, что вам нужно принять другую схему, оптимизированную для чтения. Даже если это окажется необходимым, это то, что можно включить на более позднем этапе, используя текущую расширенную схему в качестве отправной точки. У меня нет большого опыта работы с XML-деревьями, но я бы спросил: «Зачем вводить другую технологию, когда у вас есть альтернативы, которые могут использовать вашу существующую инфраструктуру?» Любое преимущество, которое вы получите от этого подхода, должно быть очень значительным, чтобы вы не отказались от преимущества рычага от вашей существующей архитектуры. Аналогичные соображения применимы к денормализованной БД. Зачем идти туда, пока не будет продемонстрирована необходимость сделать это?

  4. Опять же, я бы принял подход отслеживания версий и моментальных снимков. Вы даете основное преимущество этого подхода в своем решении 2. Я бы добавил создание моментальных снимков эталонных данных как часть процесса создания моментальных снимков, а не процесса управления версиями. (То есть, когда делается снимок, убедитесь, что соответствующие справочные таблицы являются частью снимка). Из вашего описания видно, что у вас есть два разных требования, которые используют одни и те же данные: моментальные снимки и управление версиями. Кажется, что между ними мало зависимости, и поэтому вы должны держать их как можно более независимыми - отсутствие связи.

  5. Вы упоминаете о потенциальном использовании хранилища данных в качестве хранилища, хотя это конкретно не упоминается в ваших решениях. Если ваши объемы, как вы предполагаете, невелики, я бы подумал, что отдельной базы данных достаточно. У вас действительно создается впечатление, что объемы как данных, так и пользователей для моментальных снимков невелики, поэтому на первый взгляд нет оснований для использования хранилища данных. В то же время в хранилище есть механизмы для хранения именно таких исторических данных, которые можно использовать для чтения и анализа.

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

person Chris Walton    schedule 13.04.2011
comment
Прежде всего, большое спасибо за очень вдумчивые указатели. Определенно очень полезно, и ваши усилия действительно ценятся. Я согласен с вами в пункте № 1 - блестящем пункте об изменениях процесса, которые я не предвидел. Я решил использовать моментальные снимки, используя ту же схему, но добавив только идентификатор моментального снимка и зафиксировав элементы, связанные с моментальным снимком, в таблице моментальных снимков (мой подход 2). Так что пока у меня нет необходимости фиксировать в снимке дополнительные детали, специфичные для каждой таблицы. - person Siraj Samsudeen; 19.04.2011
comment
Я также вижу понимание пункта 4 — да, существует очень небольшая зависимость между версионированием эталонных данных и моментальным снимком эталонных данных. Поэтому я решил сделать их отдельно. Я принял решения, на которые вы намекали ранее, - получение ответа от кого-то, подтверждающего мои решения, дает мне дополнительное утешение. Еще раз большое спасибо Крис за ваше время. - person Siraj Samsudeen; 19.04.2011