2008-10-26 2 views
6

Для моего приложения есть несколько классов сущностей, пользователь, клиент, сообщение и так далееSQL - Дизайн таблица - DateCreated и DateUpdated колонны

Я собираюсь спроектировать базу данных, и я хочу, чтобы сохранить дату, когда объекты были созданы и обновлены. Вот где это становится сложно. Конечно, один из вариантов заключается в том, чтобы добавить столбцы created_timestamp и update_timestamp для каждой из таблиц сущностей, но это не так, как redudant?

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

Любые мысли? Я опираюсь на внедрение последнего.

ответ

6

Сингл лог-таблица для-всех столов подход имеет две основных проблем, которые я могу думать:

  1. Конструкции таблицы журнала будет (возможно) ограничить дизайн всех остальных столы. Скорее всего, таблица журналов будет иметь один столбец с именем TableName, а затем другой столбец с именем PKValue (который сохранит значение первичного ключа для записи, которую вы регистрируете). Если некоторые из ваших таблиц имеют составные первичные ключи (т. Е. Более одного столбца), тогда для оформления таблицы журналов необходимо учитывать это (возможно, с помощью таких столбцов, как PKValue1, PKValue2 и т. Д.).
  2. Если это какое-то веб-приложение, то идентификатор пользователя, который будет доступен из триггера, будет учетной записью приложения, а не идентификатором пользователя веб-приложения (что, скорее всего, то, что вы действительно хотите сохранить в вашем поле CreateBy). Это поможет вам различать записи, созданные вашим кодом веб-приложения, и записи, созданные иначе.

Разработанные столбцы CreatedDate и ModifiedDate не являются избыточными только потому, что они определены в каждой таблице. Я бы придерживался такого подхода и помещал триггеры вставок и обновлений в каждую таблицу, чтобы заполнить эти столбцы. Если мне также нужно было записать конечного пользователя, внесшего изменения, я бы пропустил триггеры и заполнил поля timestamp и user из кода приложения.

0

Как часто вам нужно включать созданные или обновленные временные метки в слой презентации? Если ответ - это нечто большее, чем «один раз в великое время», я думаю, вам будет лучше обслуживать эти столбцы в каждой таблице.

5

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

0

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

Они применяются только к таблицам ключей (а не к таблицам соединений или таблиц данных).

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

В конце концов дизайн триггера/аудиторского стола работал хорошо, и все, что мы должны были помнить, заключалось в том, чтобы удалить и повторно использовать триггеры перед ETL (!).

0

Это для веб-CMS, над которым я работаю.Создание и последние обновленные даты будут отображаться на большинстве страниц, и будут списки для последних созданных (и обновленных) страниц. Интерфейс администратора также будет использовать эту информацию.