Выбор условий для вставки в базу данных, что позволяет легко запрашивать запись позже - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть текстовый файл, который я анализирую каждый месяц и вставляю данные в свою базу данных.Текстовый файл выглядит следующим образом.

------------------------------------------------------------------------------------------------------------------------------------------------------------
BLK. NO 410              | 1   2|  3   4   5   6   7 | 8   9| 10  11  12  13  14 |15  16| 17  18  19  20  21 |22  23| 24  25  26  27  28 |29  30| 31   1   2
          BLK   88.35    |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE  TH  FR |SA  SU| MO  TU  WE
          CR.   88.35           |194   / 159         |      |194   / 159         |      |194   / 159         |      |194   / 159         |      |239        
          OFF      14      :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : VER DFW TRC DFW   X   :   : CUU DFW    
C/O 06.00 TAFB 216.15   194=/1410/1055/0740, 159=/0900/1700/1400, 239=/1845/1945/0155
EM3 25.55 ERD 42.00 EM4 20.40 
-----------------------------------------------------------------------------------------------------------------------------

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

Эта «строка» может быть для пилота или стюардессы.До недавнего времени каждая линия могла быть для капитана или первого офицера.Но теперь у некоторых файлов есть линии капитана и линии первого офицераФайл стюардессы может содержать одну или две позиции стюардессы или более в зависимости от типа самолета.

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

Когда я анализирую текстовый файл, я буду отслеживать доступные позиции.Если это для капитана, я сохраню «CA» в базе данных.Если это первый офицер, я спасу «ФО».Если это и для капитана и для первого офицера, я спасу «CAFO».Для бортпроводников я сохраню число «1» на 1 балл бортпроводника.Для каждого дополнительного я просто увеличу его на одно число.Это позволит расширить его позже, если для более крупных самолетов потребуется больше мест для стюардесс.

Итак, резюмируя, я сохраню одно следующее для каждой записи базы данных.

  • "CAFO"
  • "CA"
  • "FO"
  • "1"
  • "2"

Теперь мне нужно получить доступ кбазы данных и получить эти записи для моей веб-программы.Если капитан хочет получить записи, ему нужны только строки капитана, которые будут «CAFO» или «CA».И как раз наоборот для первых офицеров.Когда я выполнил запрос, я обнаружил, что могу использовать команду mySQL SUBSTRING, чтобы просто получить первые 2 или последние 2 символа.

для строк капитана

SELECT Line_number,html_text FROM lines WHERE SUBSTRING (Crew_type, 1,2) = "CA"

Это просто получит первые два начальных символа из записи и будет соответствовать обоим случаям.Для Первых офицеров я начинаю с конца строки и беру последние два символа.

SELECT Line_number, html_text ОТ lines ГДЕ ПОДСТРОЙКА (Crew_type, - 2) = "FO "

Для бортпроводников я могу сравнить число.Если стюардесса хотела только строки с 1 позицией.

SELECT Line_number, html_text ОТ lines ГДЕ Crew_type = "1"

Или если онихочу все возможные позиции стюардессы

SELECT Line_number, html_text ОТ lines ГДЕ Crew_type> = "1"

Я бы установил тип столбца вENUM со значениями, которые я перечислил выше.

Мой вопрос, есть ли лучший способ решения этой проблемы?Я буду вставлять только один раз, но много получу.Будет ли команда SUBSTRING слишком сильно замедлять запросы?

1 Ответ

0 голосов
/ 21 декабря 2011
SELECT Line_number,html_text FROM lines WHERE SUBSTRING(Crew_type,1,2)="CA"

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

SELECT Line_number,html_text FROM lines Crew_type in ("CA", "CAFO")

То же самое для FO.

Так что где-то в вашем PHP я бы определил

$matches=array(
  'CA'=>'"CA","CAFO"',
  'FO'=>'"FO","CAFO"',
  'FA'=>'"1","2"'
);

и затем используйте

$match=$matches[$crew_type];
$sql="SELECT Line_number,html_text FROM lines Crew_type in ($match)";

с типом $ crew_type, равным одному из 'CA', 'FO', 'FA'

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