Member 12195606 Ответов: 1

Как спроектировать БД, которая будет показывать историю данных на определенную дату?


Я должен разработать систему, скажем, дорожной сети. Есть измерения, сделанные каждые 10 м на дороге. Эти измерения проводятся каждые два года. Мы рассматриваем около 4 миллионов записей. Не очень большой, но и не ничтожный. Данные - это просто текст.

Если дорога перестраивается, то эти измеренные данные должны быть удалены, поскольку они не соответствуют текущему состоянию дороги. И не должны использоваться в текущих расчетах. Это будет между определенным стартовым и конечным километрами.

Отчетность должна вестись не только по текущим данным, но и по тому, что было ранее.

Пользователь просто хотел бы выбрать дату, и все данные должны быть видны, чтобы они были действительны для этой конкретной даты.

Что я уже пробовал:

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

Какую модель дизайна вы бы предложили?

Richard Deeming

Это звучит так, как будто вы ищете Временные Таблицы[^].

1 Ответов

Рейтинг:
0

CHill60

Помните, что меняются не все измерения дороги, а только часть между начальным и конечным километрами.
Тогда я бы нашел способ идентифицировать каждый "кусочек" дороги - например, What3words из[^]
Сделать это исправим. Таким образом, если работа вторгается в соседний участок, то этот квадрат 3 м также переизмеряется-даже если он такой же, как и раньше.
Я создал таблицы аудита, которые заполнены триггерами. Но это трудно выбрать действительные данные на конкретную дату.
Я не понимаю, почему это было бы трудно, но трудно предложить помощь без подробностей этих таблиц.

Альтернативный подход (используемый там, где я сейчас работаю) заключается в том, чтобы записать изменения в той же таблице в новой строке - каждая строка имеет действительный-от и действительный-до даты ("текущая" запись имеет действительный-до даты 9999-12-31). Таким образом, вы не полагаетесь на свои таблицы аудита и можете довольно быстро определить, какие записи были "текущими" в любой конкретный момент времени.

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

Правка: только что заметил
Цитата:
Данные-это просто текст
Если это измерения, то используйте соответствующие типы данных - даты должны храниться в date или datetime типы столбцов и числовые данные должны храниться в числовом типе столбца. Помимо потери места и неэффективности, использование неправильного типа данных может привести ко всевозможным проблемам, которые очень трудно диагностировать и исправить.


MadMyche

+5 Единственное, что мне не нравится в этом решении, - это использование What3Words-нет реального способа посмотреть на 2 локации и сказать, насколько они близки/далеки друг от друга.
Я бы, вероятно, использовал любую систему отсчета сетки, которая является локальной для вас (например, UTM[универсальный Поперечный Меркатор] или MGRS[военная система отсчета сетки]), которая имеет разрешение до 1 метра, которое вы можете буквально вычесть друг из друга, чтобы найти расстояние

CHill60

Хорошая точка. Виртуальная 5