Я прошел через этот post для рекордного уровня управления версиями таблиц. Я заметил, что архитектура имеет дело с использованием таблиц истории. Тем не менее, мой сценарий не требует откат, а поиск точек во времени. Здесь я попытался разработать дизайн, используя одну таблицу для управления версиями. Обратите внимание, что это голые данные таблицы костей (без ограничений, индексов и т. Д.). Я намерен индексировать на основе id, так как это включает в себя предложение group by в столбце.Управление версиями базы данных без таблиц истории
К примеру, у меня есть таблица тест, где
идентификатора является идентификатором,
modstamp является временной меткой данных (никогда не нуль)
В дополнении к столбцы выше, таблица будет содержать бухгалтерские колонки
local_modstamp - это t imestamp, при котором запись была обновлена
del_modstamp является отметка времени, при котором запись была удалена
Во время резервного копирования, все записи получаются из источника и вставили, где записи будут иметь значения local_modstamp = нуль и del_stamp = null.
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
После записи получаются, эти сценарии для обработки данных (при условии, опорное время [ref_time] это время, при котором процесс выполняется):
Вставка как обычно.
Обновление: обновите самую последнюю запись с помощью local_modstamp = ref_time. Затем вставьте новую запись. Запроса будет: обновления тестового набора local_modstamp = где ID = и local_modstamp не утратившее del_modstamp не является нулевой вставки в тестовые значения (...)
Удалить: Обновление самого последнюю записи с del_modstamp = ref_time. Тест обновление устанавливается del_modstamp = где идентификатор = и local_modstamp не утратившим del_modstamp не является нулевым
дизайн нацелен на получение последних записей, где local_modstamp не равно нулю и del_modstamp не является нулевым. Однако, я столкнулся с проблемой, где я намерен получить точку во времени, используя запрос (внутрипартийной большинство запросов):
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
Кажется, что я сделал ошибку (есть я?) Использовать нуль в качестве заполнитель для определения последних записей таблицы. Есть ли способ использовать существующий проект для получения записей о времени?
Если нет, я полагаю, что вероятным решением является установка local_modstamp в последние записи. Это потребует обновления логики с использованием max (local_modstamp) в случае обновлений. Могу ли я сохранить существующую архитектуру для получения данных о времени?
Я использую SQL-сервер прямо сейчас, но этот проект может быть распространен и на другие продукты базы данных. Я намерен использовать более общий подход для извлечения данных вместо использования специфического поставщика hacks.
Если я выполняю удаление, будет ли последняя версия отмечена 1 или она будет вставлена, а затем отметьте delete с помощью 1? Это повлияет на запрос 'и v.IsDeleted = 0;' в запросе. Например, Салли покидает компанию в 2016-10-01, но я должен запросить, что такое состояние на 2016-06-01, будет игнорировать isDeleted в статье достичь цели? Я задаюсь вопросом, следует ли нормализовать таблицы. Я поддерживаю несколько тысяч в схеме, и нормализация их на две не раздувает таблицу. Можно ли его портировать в одну и ту же таблицу? – dmachop
Если нет статических данных, и каждый столбец имеет версию в таблице версий, вышеупомянутое решение может быть выполнено с помощью одной таблицы. Всякий раз, когда вы выбираете точку во времени или последние данные, для этого потребуется создать временную таблицу (выберите отдельный (id) из версии), а затем выполните соединение по мере необходимости. – dmachop
PK статичен, и опыт показывает, что редко других статических атрибутов нет. Однако вам все еще нужны две таблицы, даже если главная таблица содержит только PK. Вам нужна неверсированная главная таблица, чтобы быть целью FKs из других таблиц. Если вы читаете различные схемы управления версиями, большой, непреодолимой проблемой всегда была нехватка ссылочной целостности. Этот (vnf) решает эту проблему. – TommCatt