Сведения о вопросе

Getthesound

00:55, 26th August, 2020

Теги

Эффективная стратегия для оставления истории аудита trail/изменений для DB приложений?

Просмотров: 521   Ответов: 6

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

Немного информации о DB:

  • Необходимо иметь возможность расти на тысячи записей в неделю
  • 50-60 таблиц
  • Основные пересмотренные таблицы могут содержать несколько миллионов записей каждая
  • Разумное количество внешних ключей и индексов набора
  • Использование PostgreSQL 8.x



  Сведения об ответе

SEEYOU

01:45, 6th August, 2020

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

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


  Сведения об ответе

P_S_S

14:58, 23rd August, 2020

Если вы используете Hibernate, посмотрите на JBoss Envers . С главной страницы проекта:

Проект Envers направлен на упрощение управления версиями постоянных классов JPA. Все, что вам нужно сделать, это аннотировать ваш постоянный класс или некоторые его свойства, которые вы хотите изменить, с помощью @Versioned. для каждой версионной сущности будет создана таблица, которая будет содержать историю изменений, внесенных в сущность. Затем вы можете без особых усилий извлекать и запрашивать исторические данные.

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


  Сведения об ответе

LIZA

12:53, 24th August, 2020

В прошлом я использовал триггеры для построения журнала db update/insert/delete.

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

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


  Сведения об ответе

DO__IT

13:58, 21st August, 2020

Единственная проблема с использованием триггеров заключается в том, что он добавляет к производительности накладные расходы любого insert/update/delete. Для повышения масштабируемости и производительности необходимо свести транзакцию базы данных к минимуму. Аудит с помощью триггеров увеличивает время, необходимое для выполнения транзакции, и в зависимости от объема может вызвать проблемы с производительностью.

другой способ-изучить, предоставляет ли база данных какой-либо способ извлечения журналов "Redo", как это имеет место в Oracle. Повтор журналов-это то, что база данных использует для воссоздания данных в случае сбоя и необходимости восстановления.


  Сведения об ответе

FAriza

16:03, 15th August, 2020

Подобно триггеру (или даже с ним), вы можете заставить каждую транзакцию запускать событие ведения журнала асинхронно и иметь другой процесс (или просто поток), фактически обрабатывающий ведение журнала. Существует много способов реализовать это в зависимости от вашего приложения. Я предлагаю, чтобы приложение запустило событие, чтобы оно не вызывало ненужной нагрузки на вашу первую транзакцию (что иногда приводит к блокировкам из каскадных журналов аудита).

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


  Сведения об ответе

ASSembler

15:45, 21st August, 2020

Я использую SQL сервер, а не PostgreSQL, так что я не уверен, будет ли это работать для вас или нет, но у попа Риветта была отличная статья о создании аудита trail здесь: Поп Риветт сервер SQL FAQ No.5: Поп на аудит Trail

Создайте таблицу аудита, а затем создайте триггер для каждой таблицы, которую вы хотите проверить.

Подсказка: используйте Codesmith для создания триггеров.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться