Я собираю базу данных персонала, и мне нужно иметь возможность пересматривать информацию о сотрудниках, но также отслеживать все изменения. Как я должен структурировать базу данных, чтобы иметь несколько версий одних и тех же пользовательских данных, но иметь возможность запрашивать последнюю версию? Я просматриваю информацию, которая редко меняется, например «Фамилия», но мне нужно будет запрашивать устаревшие значения. Поэтому, если Дженни Смит изменит свое имя на Дженни Джеймс, мне нужно будет найти текущую информацию пользователя, когда я буду искать ее старое имя.Где я должен разбить свои учетные записи для отслеживания изменений
Я предполагаю, что мне понадобится хотя бы 2 таблицы, одна из которых содержит uid и другую, которая содержит ревизии. Затем я присоединяюсь к ним и запрашиваю последнюю версию. Но должен ли я разбить его еще дальше, в зависимости от того, как часто изменяются данные или тип данных? Я смотрю около 40 полей на запись, и только одно или два поля, вероятно, будут меняться за обновление. Также я не могу удалить данные из базы данных, мне нужно иметь возможность оглядываться на все предыдущие записи.
Как бы мог помочь индекс в столбце 'deleted'? Если механизм запроса использует этот индекс, не нужно ли выполнять сканирование таблицы для всех остальных столбцов? Не лучше ли индексировать поле, которое вы ищете, и просто отбросить удаленные строки из результатов поиска? –
Нет, он использовал бы сканирование индекса в удаленном столбце, а затем поиск в других столбцах. Вы можете иметь несколько индексов, а оптимизатор запросов будет использовать статистические данные, собранные в базе данных, для оценки относительной производительности каждого индекса и размещения их в порядке, чтобы сначала использовать индекс, который должен давать наименьшие результаты. Попробуйте использовать EXPLAIN PLAN для некоторых запросов, чтобы узнать, как это работает. Оптимизаторы обычно настолько умны, что им известно, что индекс не стоит использовать, если только 10% записей фактически удалены. –
Итак, позвольте мне повторить. У меня было бы две таблицы, одна из которых с неизменными идентификаторами сотрудников и одна с изменчивой информацией о персонале. Эта таблица сведений о персонале будет иметь индексированное поле (удаленное), которое я установил бы, когда новая запись будет вставлена для этого сотрудника. Когда я хочу запросить самую последнюю версию, я просто ограничиваю, где удалено = 0. Я что-то пропустил? –