Работая над системой управления контентом, я ударил немного о стену. Возвращаясь к моей модели данных, я заметил некоторые проблемы, которые со временем могут стать более распространенными.Первичные ключи, UUID, RecordKey tables, oh my
А именно, я хочу сохранить контрольный журнал (журнал изменений) изменения записи пользователем (даже записи о внесении изменений в журнал будут записаны в журнал). Из-за включения произвольного количества модулей я не могу использовать поле автоматической инкрементации для моих первичных ключей, так как это неизбежно вызывает конфликты при попытке сохранить свои ключи в одной таблице.
Аудиторский след будет вести учет user_id
, record_id
, timestamp
, action
(INSERT/UPDATE/DELETE) и archive
(сериализованная копия старой записи)
Я рассмотрел несколько возможных решений проблема, например, создание первичного ключа UUID
в логике приложения (для обеспечения совместимости платформы с базой данных).
Другой вариант, который я рассмотрел (и я уверен, что консенсус будет отрицательным даже для рассмотрения этого метода), создается таблица RecordKey
, чтобы поддерживать глобально автоматически увеличивающийся ключ. Тем не менее, я уверен, что для этого есть намного лучшие методы.
В конечном счете, мне интересно узнать, какие варианты я должен учитывать при попытке реализовать это. Например, я намереваюсь разрешить (по крайней мере) варианты для хранения MySQL и SQLite3, но я обеспокоен тем, как каждая база данных будет обрабатывать UUID
.
Изменить, чтобы вопрос был неясным: Будет ли использовать глобальные идентификаторы для решения моей проблемы? Если это так, используя 128-битный UUID (сгенерированный программой или базой данных), что я могу сделать в моем дизайне таблиц, что поможет максимизировать эффективность запросов?
Thanks ** Thilo **; Это соображение, которое я сделал, добавив `table_name` и используя его, как вы описали. Разумеется, добавление его в качестве дополнительной части данных для полноты в контрольном журнале могло бы помочь. Но рассмотрите эту ситуацию; Пользователь удаляет модуль блога в пользу более всеобъемлющего, но оба модуля блога используют одну и ту же схему именования для таблиц. Конфликты могут возникнуть, поскольку я не собираюсь каскадировать удаление записей аудита. Вот почему я склоняюсь к какой-то глобальной реализации. – Dan 2010-11-26 05:02:28
Этот конфликт, который вы описываете, не будет проблемой, поскольку у вас все еще есть отметки времени, чтобы узнать, какой модуль используется в какой таблице. Единственная проблема будет заключаться в том, что кто-то устанавливает оба модуля одновременно, но это кажется невозможным, так как база данных также нравится, что ее имена таблиц различны. Фактически, ваша таблица аудита с вышеуказанным подходом будет очень похожа на то, как работают таблицы собственных метаданных базы данных. – Thilo 2010-11-26 05:21:08
Thanks ** Thilo **; Вы правильно относитесь к установкам. Проверка установки модулей на существующие таблицы, пути и т. Д. И в зависимости от степени серьезности, уведомляет пользователя или вообще не работает. – Dan 2010-11-26 08:18:13