Проектирование базы данных - отслеживание последнего снимка предоставленных пользователем данных - PullRequest
0 голосов
/ 26 июня 2018

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

В настоящее время мы получаем последний снимок следующим образом - группируем данные по уникальному идентификатору и сортируем по первичному ключу db, а затем находим запись Max (первичный ключ db). Я думаю добавить флаг снимков к снимкам, чтобы указать, какой снимок активен, чтобы мы могли упростить запросы SQL. Но наш администратор БД сказал, что это плохо сказывается на производительности (или усложняет процесс), потому что это означает, что каждый раз, когда пользователь изменяет данные, нам требуется дополнительный шаг для деактивации текущего снимка, а операция обновления обходится дороже, чем поиск для базы данных. Но для меня запросы SQL для извлечения данных становятся слишком сложными, потому что у нас есть моментальные снимки для всего, поэтому нам нужно группировать моментальные снимки практически для любых данных, и это также подвержено ошибкам, когда мы пытаемся извлечь несколько типов представленных данных и данные связаны (мы должны быть очень осторожны с тем, где в sql получить последние снимки). Поэтому я хочу получить некоторые мнения по этому вопросу. Есть мнения или предложения? или, может быть, просто объясните мне, почему наличие флага статуса - плохая идея.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Эта тема выглядит для меня как отслеживание таблицы аудита. Лучше всего иметь триггеры для таблиц и записывать такие изменения, как вставка, обновление, удаление в отдельные таблицы.

например. У вас есть таблица CUSTOMER и AUDIT_ CUSTOMER. В CUSTOMER у вас есть текущие данные, а в AUDIT_CUSTOMER - вся история.

Таблицы аудита зависят от дизайна и имеют такую ​​структуру

DT - date and time
USER_NAME - user changed data
KIND - I,U,D (insert, update, delete)
oryginal_table_fields_here

Вы просто вставляете данные в триггеры, и вы можете просто извлечь текущие данные, и вы можете вернуться во времени, если хотите, изменив только исходную таблицу с НОРМАЛЬНОЙ на АУДИТ и отфильтровав по DT

0 голосов
/ 26 июня 2018

Флаг статуса - один из лучших способов выполнить то, что вы хотите. На самом деле использование Max (первичный ключ дБ) требует больше вычислительной мощности, чем попытка найти двоичное значение (0 или 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...