Индексирование таблиц Foxpro

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

Индексы нужно создавать

1. по фамилии-имени-отчеству - основной способ, наиболее удобный для операторов
2. по ключевому полю - для связывания баз
3. по тем полям, по которым будет часто делаться выборка - для ускорения работы программы
4. по тем полям, по которым нужна сортировка, если пофамильная не устроит - обычно это какой-либо номер

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

Вот тут возникает вопрос, как это лучше сделать. Понятно, что сортировки по фамилии недостаточно, желательно учесть имя и отчество. Но если создать индекс простейшим способом: famil+name+father то он будет большим, что плохо. Место на диске занимает, дольше грузится, легче повреждается. И при этом, больше чем наполовину он состоит из концевых пробелов.

Можно сделать так: trim(famil)+left(name,3)+left(father,3) При этом список будет отсортирован по фамилии полностью, а по имени-отчеству - на глубину три символа. То есть Николаевич может оказаться перед Никитовичем, но практически это незаметно. Минус способа - не так точно будет работать поиск. При этом для получения точного результата потребуются дополнительные ухищрения. Впрочем, они все равно потребуются, поскольку в больших базах полные тезки встречаются часто.

Со второй таблицей (документами) - другая проблема. Здесь вопрос в том, учитывать ли серию документа. Очень может быть, что она не очень-то и нужна, по крайней мере для данной задачи. Если создать индекс только по номеру, а при просмотре столбец "Серия" выводить за колонкой "Номер", может получиться аккуратнее. Особенно, если серия для данного типа документов не указывается.

Создание и изменение индексов делается так же, как создание и изменение структуры таблицы, только используется вторая вкладка - Indexes (обведена красным). При этом учтите - двойной щелчок по таблице в Database Designer откроет для просмотра и редактирования таблицу, а не структуру. Для изменения структуры используйте кнопку в Database Designer, или пункт Modify из Database системного меню (таблица должна быть выбрана!).

А при работе в Project Manager все происходит наоборот - двойной щелчок (или кнопка Modify) редактирует структуру, а кнопка Browse - содержимое таблицы.

Имя индекса нужно придумать, тип же лучше пока не трогать (об этом чуть позже).Придумав и введя имя индекса, в графе "Expression" (обведено синим) нужно указать поле, по которому строится данный индекс, в данном случае это поле kod.

Внимание!

Пока вы не введете имя индекса, окно будет пустым. Заголовки, рамочки и кнопки появятся после того, как введено имя.

Проще и лучше всего ввести соответствующее выражение (например имя поля) графу в "Expression" вручную. Но если очень хочется, можно использовать построитель. Для этого нужно щелкнуть мышкой по кнопке с точками. Откроется окно:

Работать с ним не так-то просто, но в данный момент все, что нужно - это выбрать не печатая руками, ввести в "Expression" слово"kod". Делается это мышкой, двойным щелчком по имени поля в Field-е. После чего нажимаем "ОK", и первый индекс создан.

Следующий индекс назовем pofio. При помощи мыши ставим курсор в одинокую пустую рамочку под словом pokodu и повторяем все действия. Только в этот раз обходимся без построителя, просто впечатав в "Expression" следующий текст

trim(famil)+left(name,3)+left(father,3)

В этом случае у фамилии будут обрезаны хвостовые пробелы, и в индекс, для Александра Сергеевича Пушкина, попадет значение ПушкинАлеСер. Для сортировки этого достаточно. И позже даст нам возможность поупражняться с поиском для такого экзотического решения.

В итоге, после нажатия на кнопку "ОК" получается так:

Черные стрелочки вверх означают, что индекс построен по возрастанию значений, то есть от А к Я, или от 1 к 9.

Кнопочку со двойной стрелкой вверх-вниз можно захватить мышкой и перетащить выше или ниже, поменяв порядок индексов. Практически это влияет только на команду set orde to, если в ней используются порядковые номера индексов.

Работа почти сделана, осталось лишь одно, но очень важное действие - для индекса "pokodu", указать тип "Primary". Но не спешите.

Нажмите ОК, чтобы сохранить изменения, и снова откройте это окно, и в нем - вкладку Indexes. Теперь можно изменить тип индекса на Primary.

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

А почему так сложно, почему нельзя было сразу указать Primary? Можно, но я не знал, заполнили вы таблицу сразу после создания, или нет. Если в таблице есть несколько строк, в которых не заполнено поле "kod", например пустых строк, то при попытке сменить Regular на Primary возникнет ошибка. И совершенно неясно, что с ней делать, поскольку ошибка в одном месте, а вы сейчас работаете в другом.

Если у вас все же так получилось, нужно удалить пустые записи, или ввести в поле kod разные для каждой записи числа(знаки, слова). Если вы решили удалить строки, то после этого не забудьте выполнить упаковку (командой pack). Ведь Фокс не удаляет записи сразу, а только помечает их как удаленные, на случай, если вы передумаете.

Все, с первой таблицей закончили.

Теперь все действия нужно повторить для второй таблицы, за исключением того, что для поля код тип индекса Regular менять на Primary НЕ нужно. Иначе программа не будет работать. Вернее будет, но неправильно. Один документ для человека можно будет ввести, а второй - нет.

Структура второй таблицы у нас такая:

Индексы нужно создавать по полю kod и nom_doc (или ser_doc+nom_doc, если хотите учесть серию). Поскольку они создаются по коду и по номеру, назовем их соответственно pokodu и ponomeru.

После создания индексов во второй таблице база будет выглядеть так:

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

Осталось ее заполнить

 
К оглавлениюк следующей статье