Каждый раз, когда мне нужно спроектировать новую базу данных, я трачу некоторое время на размышления о том, как мне настроить схему базы данных, чтобы вести журнал аудита изменений.
Здесь уже задавались некоторые вопросы по этому поводу, но я не согласен с тем, что существует единый лучший подход для всех сценариев:
- Дизайн базы данных для ревизий
- Лучший дизайн для таблицы базы данных аудита журнала изменений
- Идеи по созданию базы данных для сбора контрольных записей
Я также наткнулся на эту интересную статью «Ведение журнала изменений базы данных», в которой попытался перечислить все «за» и «против» каждого подхода. Это очень хорошо написано и содержит интересную информацию, но это сделало мои решения еще сложнее.
Мой вопрос: есть ли ссылка, которую я могу использовать, может быть, книга или что-то вроде дерева решений, на которое я могу сослаться, чтобы решить, каким путем мне идти, основываясь на некоторых входных переменных, например:
- Зрелость схемы базы данных
- Как будут запрошены журналы
- Вероятность того, что будет необходимо воссоздать записи
- Что важнее: написать или прочитать производительность
- Природа значений, которые регистрируются (строка, числа, капли)
- Доступное место для хранения
Подходы, которые я знаю:
1. Добавьте столбцы для созданной и измененной даты и пользователя
Пример таблицы:
- мне бы
- значение_1
- значение_2
- VALUE_3
- Дата создания
- MODIFIED_DATE
- создано
- модифицирован
Основные минусы: мы теряем историю модификаций. Не могу откатиться после коммита.
2. Вставьте только таблицы
- мне бы
- значение_1
- значение_2
- VALUE_3
- из
- в
- удалено (логическое)
- пользователь
Основные минусы: как поддерживать актуальность внешних ключей? Нужно огромное пространство
3. Создайте отдельную таблицу истории для каждой таблицы
Пример таблицы истории:
- мне бы
- значение_1
- значение_2
- VALUE_3
- value_4
- пользователь
- удалено (логическое)
- отметка времени
Основные минусы: необходимо дублировать все проверенные таблицы. Если схема изменится, потребуется перенести и все журналы.
4. Создайте сводную таблицу истории для всех таблиц
Пример таблицы истории:
- table_name
- поле
- пользователь
- new_value
- удалено (логическое)
- отметка времени
Основные минусы: Смогу ли я легко воссоздать записи (откат), если это необходимо? Столбец new_value должен быть огромной строкой, чтобы он мог поддерживать все типы столбцов.
источник
Ответы:
Один из методов, который используется несколькими вики-платформами, заключается в разделении идентифицирующих данных и контента, который вы проверяете. Это добавляет сложности, но в итоге вы получаете контрольный журнал с полными записями, а не просто списки полей, которые были отредактированы, и которые затем нужно объединить, чтобы дать пользователю представление о том, как выглядела старая запись.
Например, если у вас есть таблица « Возможности для отслеживания сделок продажи», вы фактически создадите две отдельные таблицы:
Opportunities
Opportunities_Content (или что-то в этом роде)
Таблица Opportunities будет содержать информацию, которую вы будете использовать для уникальной идентификации записи, и будет содержать первичный ключ, на который вы будете ссылаться для ваших отношений с внешним ключом. Таблица Opportunities_Content будет содержать все поля, которые могут изменить ваши пользователи и для которых вы хотите вести контрольный журнал. Каждая запись в таблице содержимого будет включать в себя свой собственный PK и данные об изменении и дате изменения. Таблица Opportunities будет содержать ссылку на текущую версию, а также информацию о том, когда основная запись была создана и кем.
Вот простой пример:
И содержание:
Я бы, вероятно, сделал PK таблицы содержимого ключом из нескольких столбцов из PageID, и Revision при условии, что Revision был типом идентификации. Вы бы использовали колонку Revision в качестве FK. Затем вы извлекаете консолидированную запись, присоединяясь так:
Там могут быть некоторые ошибки ... это с моей головы. Это должно дать вам представление об альтернативном паттерне.
источник
PageContent.PageID
это ФКPage.ID
иPage.CurrentRevision
ФКPageContent.Revision
? Эта зависимость действительно круговая?id, revision_id
; на самом деле больше соединительного стола. Это чувствует себя немного вонючей для меня. Какое преимущество это имеет по сравнению с подходом 3 в OP (таблица истории на проверенную таблицу)?Если вы используете SQL Server 2008, вам, вероятно, следует рассмотреть возможность сбора данных об изменении. Это новое для 2008 года и может сэкономить вам значительный объем работы.
источник
Я не знаю ни одной ссылки, но я уверен, что кто-то что-то написал.
Однако, если цель состоит в том, чтобы просто получить отчет о том, что произошло - наиболее типичное использование журнала аудита - тогда почему бы просто не сохранить все:
Предположительно это поддерживается триггером.
источник
Мы создадим небольшую базу данных для блогового приложения. Требуются две таблицы:
blog
: хранит уникальный идентификатор сообщения, заголовок, контент и удаленный флаг.audit
: хранит базовый набор исторических изменений с идентификатором записи, идентификатором сообщения в блоге, типом изменения (NEW, EDIT или DELETE) и датой / временем этого изменения. Следующий SQL создаетblog
и индексирует удаленный столбец:Следующий SQL создает
audit
таблицу. Все столбцы проиндексированы, а внешний ключ определен для audit.blog_id, который ссылается на blog.id. Поэтому, когда мы физически УДАЛЯЕМ запись в блоге, ее полная история аудита также удаляется.источник
Я думаю, что нет ничего похожего на дерево решений. Так как некоторые плюсы и минусы (или требования) на самом деле не учитываются. Например, как вы измеряете зрелость?
Так что просто выровняйте свои бизнес-требования для ведения журнала аудита. Постарайтесь предсказать, как эти требования могут измениться в будущем, и сформируйте свои технические требования. Теперь вы можете сравнить его с плюсами и минусами и выбрать правильный / лучший вариант.
И будьте уверены, не имеет значения, как вы решите, всегда найдется кто-то, кто думает, что вы приняли неправильное решение. Тем не менее, вы сделали свою домашнюю работу и оправдываете свое решение.
источник