Архивирование записей из БД, через определённый промежуток времени. Как лучше сделать?
Предположим есть БД, в которую сервер сливает данные из большого кол-ва однотипных источников. Например, из ночных клубов финансовую информацию о покупках через кассу, не важно, просто пример.
В БД есть таблица Payment. Вот в эту таблицу за сутки может слиться очень большое кол-во записей с 1000 клубов. У нас есть условие, что нужно данные из этой таблицы через 2 года отправлять на архивный сервер. Вот как лучше организовать такие таблицы, чтобы это не тормозило. Ведь данные будут периодически как-то проверяться есть ли для репликации в архив что-то сегодня. Да, в принципе, можно проверять всего 1 раз в сутки.
Что думаю я:
Вариант 1:
Создаётся таблица с датами. В таблице с датами хранится дата с точностью 1 сутки. В эту таблицу помещается дата и идентификатор. В таблицу Payment добавляем CreationDateId, который соответствует дате в той первой таблице с датами. Тем самым мы сэкономим на каждой таблице не много, но и не мало, да и не нужна нам точная дата создания записи, хватит и суток. В итоге у нас будет одна таблица Payment, которая содержит гигантское кол-во записей.
Вариант 1 - проблемы:
При поиске записей, которые надо слить в архив и при удалении реплицированных данных будут тормоза. Похоже, вариант отпадает? Или можно что-то даже в этом варианте сделать так, что будет работать хорошо?
Вариант 2:
Создаём в БД всё так же таблицу с датами и CreationDateId в каждой записи из таблицы Payment и других, как описано в варианте 1.
Далее мы создаём таблицу, которая хранит названия таблиц, которые ещё не реплицированы.
Payment_Tables_NR (NR -Not Replicated).
Payment_Tables_Del
В Payment_Tables_NR мы помещаем название таблицы, которая соответствует сегодняшнему дню:
Payment_16_02_2016, все данные пришедшие 16.02.2016 мы пишем в Payment_16_02_2016 и каждый день по той же схеме. В Payment_Tables_NR мы помещаем название этой таблицы. Потом, когда надо узнать, какие записи нужно реплицировать, тогда мы и проверяем даты из названий таблиц из Payment_Tables_NR. Когда мы, какие нужно данные реплицировали, из Payment_Tables_NR удаляем название таблицы, данные из которой реплицированы. Помещаем это название в Payment_Tables_Del. Далее, в какой-то промежуток времени срабатывает триггер в Бд и удаляет все таблицы из БД, которые есть в Payment_Tables_Del и после этого удаляет названия этих таблиц из Payment_Tables_Del.
Или есть ещё круче решение?
Или может есть где-то исходники, где эта схема реализована очень грамотно?
В таблице с вашими записями заведите поле CreationDate и заполняйте его при добавлении записей. Индекс по этому полю и поиск в базе старых записей будет отрабатывать очень быстро без особого напряга на сервер.