У меня есть вопрос относительно двух дополнительных столбцов (timeCreated, timeLastUpdated) для каждой записи, которую мы видим во многих решениях. Мой вопрос: есть ли лучшая альтернатива?Как вы не добавляете поля timestamp в свои таблицы?
Сценарий: у вас есть огромная БД (с точки зрения таблиц, а не записей), а затем приходит клиент и просит добавить «временную привязку» к 80% ваших таблиц.
Я считаю, что это можно сделать, используя отдельную таблицу (TIMESTAMPS). В этой таблице в дополнение к очевидному столбцу временной метки указывается имя таблицы и первичный ключ для обновляемой таблицы. (Я предполагаю, что для большинства ваших таблиц вы используете int как первичный ключ, но имя таблицы, скорее всего, должно быть строкой).
Чтобы представить это, предположим, этот базовый сценарий. Мы бы две таблицы:
ОПЛАТА: - (ваши обычные записи)
TIMESTAMP: - {текущий временной метки} + {TABLE_UPDATED
, id_of_entry_updated
, timestamp_type
}
Обратите внимание, что в этой конструкции не нужны те, два «дополнительных» столбца в вашем родном объекте оплаты (который, кстати, может сделать это через ваше решение ORM), потому что теперь вы индексируете TABLE_UPDATED
и id_of_entry_updated
. Кроме того, timestamp_type
расскажет вам, есть ли запись для вставки (например, «1»), обновление (например, «2») и все, что вы можете добавить, например «удаление».
Я хотел бы знать, что вы думаете об этом дизайне. Меня больше всего интересуют лучшие практики, что работает и масштабируется с течением времени. Ссылки, ссылки, записи в блогах более чем приветствуются. Я знаю, по крайней мере, один патент (в ожидании), который пытается решить эту проблему, но, похоже, детали не являются общедоступными в настоящее время.
Приветствия, Эдуардо
соединение не обязательно должно использовать строку как часть предложения «ВКЛЮЧЕНО». Если это первая часть индекса, она может быть проверена только один раз за запрос в зависимости от того, насколько хорош оптимизатор. – BCS 2008-09-30 20:45:46
Но если он хранит временные метки из разных таблиц в одной большой таблице TIMESTAMP, ему потребуется дифференцировать временные метки INVOICE от, например, временных меток USERACCOUNT, так что это не должно быть: ON TIMESTAMP.id_of_entry И tablename = 'INVOICE «? – Dana 2008-09-30 20:49:55
Я считаю, что у вас есть точка, Дана. Однако, поскольку имена таблиц уникальны, вы думаете, что я могу уйти с простым хэшем (например, используя ascii-представление имен таблиц, чтобы сделать его int)? Таким образом, я бы завершил индексирование двух полей int. что вы думаете? – esegura 2008-09-30 21:07:41