Вести действительные записи в таблице - PullRequest
0 голосов
/ 04 февраля 2009

У меня есть таблица с данными о расписании рейсов. Каждое расписание имеет дату_действия & даты_для. Я загружаю эту таблицу из плоского файла, который не предоставляет мне дату: Поэтому во время загрузки я запрашиваю эту информацию у пользователя.

Предположим, что пользователь указал дату от текущей даты и дату от 31 марта. Теперь, 1 марта, пользователь загружает новое расписание рейсов, а пользователь указывает дату от текущей даты до даты 31 мая.

Если я запрашиваю таблицу на дату вступления в силу с 1 марта по 31 марта, запрос возвращает мне две записи для каждого рейса, в то время как мне нужна только одна запись для каждого рейса, и это должна быть последняя запись.

Как мне это сделать? Должен ли я обработать это по запросу или при загрузке проверить и исправить данные?

Ответы [ 4 ]

0 голосов
/ 06 февраля 2009

Описание проблемы и комментарий к одному из предложений дает бизнес-правила:

  • запрос рейсов с датой вступления в силу должен возвращать только одну запись за полет
  • возвращенная запись должна быть самой последней записью
  • предыдущие расписания должны храниться в таблице

Ключ к ответу заключается в том, как определить, какая запись является самой последней. Самый простой ответ - добавить столбец, в котором будет записана метка времени при вставке строки. Теперь, когда вы запрашиваете рейс и указанную дату вступления в силу, вы просто получаете результат с последней вставленной временной меткой (что можно сделать с помощью ORDER BY DESC и вернуть возвращенную первую строку).

Вы можете сделать аналогичный запрос только с датой вступления в силу и вернуть все рейсы - опять же, для каждого рейса вы просто хотите вернуть строку, которая включает дату вступления в силу, но с самой большой отметкой времени. Есть хитрый прием для нахождения максимума чего-либо на групповой основе - левый объединяет результаты с самим собой, так что left Автор High Performance MySQL приводит простой пример этого.

Это гораздо проще, чем пытаться задним числом исправить старые расписания - и, на первый взгляд, старые графики должны быть сохранены, чтобы удовлетворить ваши бизнес-требования. Это также означает, что вы можете отвечать на исторические вопросы - вы всегда можете узнать, как выглядела ваша таблица расписания на определенную дату - это значит, что она очень удобна при создании отчетов, таких как «Изменения в расписании на этот месяц» и т.

0 голосов
/ 04 февраля 2009

Я предполагаю, что у каждого рейса есть какой-то уникальный идентификатор, в противном случае как они могут отличаться. Затем вы можете добавить в расписание дополнительное поле «Актив». При загрузке в новом расписании - запросить первые существующие записи с тем же идентификатором рейса и установить для них значение Active = false. Новая запись вводится с Active = true.

Запрос тогда прост: выберите * из расписания, где active = 1

0 голосов
/ 05 февраля 2009

Я разработал это решение, но, если возможно, искал еще лучшее решение.

Table Schedule {
scheduleId, flightNumber, effective_from,effective_to
}

Data in Schedule table {
1, XYZ12, 01/01/2009, 31/03/2009
2, ABC12, 01/01/2009, 30/04/2009
}

Теперь пользователь загружает другую запись 3, XYZ12, 01/03/2009, 31/05/2009

выберите scheduleId из расписания, где flightNumber = 'XYZ12' и (ffective_from <'01 / 03/2009 'иffective_to> '01 / 03/2009' илиffective_from <'31 / 05/2009 'иffective_to> '31 / 05/2009' )

Если приведенный выше запрос возвращает мне какой-либо результат, который означает, что он перекрывается, и я должен выдать ошибку пользователю.

0 голосов
/ 04 февраля 2009

Вам необходимо указать первичный ключ для данных (который может быть «деловым» ключом). Должно быть что-то, что однозначно идентифицирует расписание каждого рейса (похоже, что оно не должно включать силу_откуда. Как только этот ключ установлен, вы проверяете его при импорте, а затем либо обновляете существующую запись, либо вставляете новую.

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