django AuditTrail против реверсии

Я работаю над новым веб-приложением, мне нужно сохранить любые изменения в базе данных для таблиц аудита. Назначение таких таблиц аудита состоит в том, что позже в реальном физическом аудите мы можем установить, что произошло в ситуации, кто что редактировал и в каком состоянии была БД во время, например, сложный расчет. Таким образом, в основном таблица аудита будет записываться, а не читаться. Однако иногда отчет может быть сгенерирован.

Я искал доступное решение

  1. AuditTrail - просто, и поэтому я склоняюсь к нему, я могу понять его однофайловый код.
  2. Reversion — выглядит достаточно просто для использования, но не уверен, насколько легко будет изменить его при необходимости.
  3. rcsField кажется очень сложным и слишком сложным для моих нужд.

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


person Anurag Uniyal    schedule 04.05.2009    source источник
comment
Самая последняя и поддерживаемая реализация подхода AuditTrail и HistoricalRecordsdjango-simple-history.   -  person Ivan Kharlamov    schedule 04.09.2013


Ответы (3)


Лично я предпочитаю создавать таблицы аудита в базе данных и заполнять их с помощью триггеров, чтобы сохранялись любые изменения, даже специальные запросы из окна запроса. Я бы никогда не рассматривал решение для аудита, которое не основано на самой базе данных. Это важно, потому что люди, которые вносят злонамеренные изменения в базу данных или совершают мошенничество, вряд ли будут делать это через веб-интерфейс, а будут делать это напрямую на серверной части. Гораздо больше таких вещей происходит от недовольных или вороватых сотрудников, чем от сторонних хакеров. Если вы уже используете ORM, ваши данные находятся под угрозой, поскольку разрешения находятся на уровне таблицы, а не на уровне sp, к которому они относятся. Поэтому еще более важно, чтобы вы фиксировали любые возможные изменения в данных, а не только то, что было в графическом интерфейсе. У НАС есть динамический процесс для создания таблиц аудита, который запускается всякий раз, когда в базу данных добавляются новые таблицы. Поскольку наши таблицы аудита заполняют только изменения, а не всю запись, нам не нужно изменять их каждый раз, когда добавляется поле.

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

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

person HLGEM    schedule 04.05.2009
comment
Я выбрал программное решение вместо БД (поэтому теперь я ищу обслуживаемое решение). Решение B не может обслуживать состояние приложения (легко). Что касается безопасности, я думаю, что если у человека есть доступ к БД и он одержим мошенничеством, что делает вы думаете, что он не удалит такой триггер аудита базы данных или не изменит сами таблицы аудита, если они не хранятся в 3-м физическом месте с тяжелой секцией - person Anurag Uniyal; 06.05.2009

Я не могу дать вам реальный опыт ни с одним из них, но хотел бы сделать наблюдение.

Я предполагаю, что под AuditTrail вы подразумеваете AuditTrail на вики Django. Если это так, я думаю, вы захотите вместо этого взглянуть на HistoricalRecords, разработанный тем же автором (Марти Алчин, он же @gulopine) в его книге Про Джанго. Это должно работать лучше с Django 1.x.

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

person Van Gale    schedule 04.05.2009
comment
Да, под AudtiTrail я имел в виду AuditTrail на вики Django, поэтому для HistoricalRecords мне нужно покупать книгу или доступен код? - person Anurag Uniyal; 04.05.2009
comment
Некоторые из его других проектов есть в сети, но я не могу найти этот конкретный код даже на prodjango.com. - person Van Gale; 04.05.2009
comment
Если кто-то еще найдет этот вопрос, как и я, следует отметить, что HistoricalRecords был расширен с разрешения Марти Алчина и теперь доступен как django-simple-history: bitbucket.org/q/django-simple-history - person Trey Hunner; 12.02.2011

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

Итак, я протестировал AuditTrail, и Reversion Reversion кажется лучшим полноценным приложением со многими функциями (которые мне не нужны). Кроме того, насколько мне известно, оно сохраняет данные в одной таблице в формате XML или YAML, что я думаю

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

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

Так что я иду с AuditTrail.

person Anurag Uniyal    schedule 17.05.2009
comment
Вы видели этот класс FullHistory: djangosnippets.org/snippets/1234? Я начал наблюдать проблему вашего вопроса, и пока не нашел лучшего решения. У вас есть проблемы с AuditTrail? - person ramusus; 04.06.2009
comment
Я не заглядывал в FullHistory, но если это сработает, это будет действительно простое решение, пока я не использую auditTrail в производстве, но первоначальный тест, кажется, предполагает, что он будет работать нормально. - person Anurag Uniyal; 08.06.2009