Индексы и производительность
Индексы — это средство предотвращения ввода неверных данных или средство, повышающее производительность?
Индексы не только препятствуют дублированию значений. Они также незаменимы, когда нужно увеличить скорость обычного поиска. Программа Access может использовать индекс для поиска нужной ей записи во многом так же, как вы применяете предметный указатель в конце книги для поиска конкретной темы или термина.
Если вы выполняете поиск для удаления из таблицы Employeesсотрудника с заданным номером социального обеспечения (SSN), Access может применить индекс. С его помощью программа найдет совпадающее значение гораздо быстрее и просто перейдет по указателю к полной записи.
Дополнительную информацию о том, как индексы могут ускорить поиск, вы найдете в примечании "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей " главы. 6. Но важно знать, что индексы улучшают производительность только в случае очень больших и сложных таблиц. Если вы храните несколько сотен записей, в каждой из которых горстка полей, вам на самом деле не нужен индекс — Access и так выполнит поиск с ошеломляющей скоростью.
Индексы для нескольких полей
Вы также можете применять индексы для предотвращения повторений комбинации значений. Представьте себе, что вы создаете таблицу People(люди) для хранения списка ваших друзей и их контактной информации. Вам могут встретиться одинаковые имена и фамилии.
Но, возможно, вы хотите помешать включению в две записи одинаковых и имени, и фамилии. Такой запрет избавит вас от случайного ввода сведений об одном и том же человеке дважды.
Примечание
Данный пример может привести к нескончаемым проблемам, если у вас действительно есть двое друзей с одинаковыми именем и фамилией. В этом случае вам придется удалить индекс до ввода этих имени и фамилии. Прежде чем создавать любые индексы, следует серьезно подумать о законных основаниях возможного дублирования значений.
Для обеспечения уникальности комбинации полей необходимо создать составной индекс, в котором объединяется информация из нескольких полей. Далее описаны необходимые для этого действия. 1. В Конструкторевыберите на ленте Работа с таблицами | Конструктор → Показать или скрыть → Индексы(Table Tools | Design → Show/Hide → Indexes).
На экране появится окно Индексы(Indexes) (рис. 4.6). С его помощью можно просмотреть уже созданные индексы и создать новые.
Рис. 4.6. В окне Индексыпоказаны все индексы, которые определены в таблице.
В нем приведен простой индекс для поля ID (создаваемого программой Access автоматически)
и составной индекс, который в данный момент создается
2. Выберите имя для вашего индекса. Введите его в первую пустую строку в столбце Индекс(Index Name)
Имя индекса не важно — программа Access использует его для хранения индекса в БД, но вы не увидите его во время работы с таблицей. Обычно для этого используются имена одного или нескольких полей, которые индексируются (например, LastName+FirstName).
3. Выберите первое поле в столбце Имя поля(Field Name) в той же строке (например, LastName).
Какое поле вы укажете первым, не имеет значения. В любом случае индекс сможет помешать дублированию значений. Но порядок играет роль в случае использования индекса в поиске для повышения производительности. Вы узнаете об этом больше в примечании "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей" главы 6.
4. В нижней части окна установите значение свойства Уникальный индекс(Unique) равным Да. В этом случае создается индекс, запрещающий совпадения значений (в отличие от индекса, применяемого только для увеличения скорости поиска).
Вы также можете задать значение Да для свойства Пропуск пустых полей(Ignore Nulls), если хотите, чтобы программа Access разрешила дублирование пропущенных (незаданных) значений. Например, вы хотите сделать поле номера социального обеспечения (SSN) необязательным. Но если уж SSN вводится вы хотите быть уверенным в том, что он не совпадает ни с каким другим значением, в данном случае вам следует задать значение Да в свойстве Пропуск пустых полей.Если значение этого свойства равно Нет, программа Access разрешит только одной записи иметь пропущенное (неопределенное) значение в поле SSN, что, возможно, вас не устроит.
Примечание
Можно запретить пропущенные значения вместе с применением свойства Обязательное поле,как описывается в разд. "Запрет незаполненных полей" ранее в этой главе.
Пропустите свойство Ключевое поле(Primary), которое задает индекс первичного ключа.
5. Перейдите на одну строку ниже. Оставьте поле Индекспустым (это говорит программе Access о том, что это часть предыдущего индекса), но выберите другое поле в столбце Имя поля(например, FirstName).
Если вы хотите создать составной индекс из нескольких полей (больше двух), просто повторяйте этот шаг до тех пор, пока не вставите все нужные поля. На рис. 4.7 показано, как выглядит сформированный индекс. Теперь можно закрыть окно Индексы.
Рис. 4.7. Здесь представлен составной индекс, препятствующий включению в таблицу двух людей с одинаковыми именем и фамилией
Маски ввода
Как вы уже знаете, БД ценят непротиворечивость данных. Если у вас есть поле Height(рост), лучше использовать в нем значения, заданные в одних и тех же единицах измерения,
в противном случае ваши данные и ломаного гроша стоить не будут. Аналогично, если у вас есть поле PhoneNumber (номер телефона), лучше убедиться в том, что у всех номеров один и тот же формат. Если одни телефонные номера записаны с дефисами, пробелами и скобками (например, (844) 547-1123), в то время как другие несколько отличаются (скажем, 847-547-1123), а третьи вообще пропускают междугородний код (547-1123), у вас появится небольшая проблема. Из-за недостатка согласованности вам будет трудно обрабатывать такие данные (например, искать конкретный телефонный номер или отсортировать телефонные номера в зависимости от междугороднего кода).
Рис, 4.8. Вверху: показано поле PhoneNumber с маской, готовое принимать данные. К этому моменту пользователь, вводящий данные, еще не ввел ни одного символа. В поле PhoneNumber автоматически выводится текст, содержащий символы-заполнители. Внизу: маска форматирует номера по мере их ввода. Если вы введете 1234567890 в данную маску телефонного номера, то увидите следующий текст: (123) 456-7890. В файле БД данные хранятся как 1234567890, а на листе данных представлены с привлекательным внешним оформлением. Это оформление и есть маска
Для облегчения обработки значений, имеющих фиксированный шаблон, — например, телефонных номеров — вы можете воспользоваться маской ввода. Маска ввода (или маска для краткости) предоставляет возможность сообщить программе Access, какой шаблон или образец должны использовать ваши данные. Основываясь на этом образце, Access изменяет
способ ввода и редактирования значений, делая их более понятными и менее подверженными ошибкам. На рис. 4.8 показано, как маска позволяет программе Access форматировать последовательность символов в процессе их ввода в поле.
Вы можете добавить маску для любого поля с текстовым типом данных. По сравнению с обычным текстом маски обладают рядом достоинств,
■ Маски управляют элементом ввода. Будучи пустым, шаблон маски отображает символы-заполнители, на место которых должны попасть значения. В пустой маске телефонного номера отображается текст (_ _ _)_ _ _ - _ _ _ , ясно обозначающий вид необходимых
данных.
■ Маски помогают понять смысл данных. Гораздо легче читать множество значений, представленных определенным образом. Большинство людей быстрее найдут нужные номера социального обеспечения, если они будут представлены как (012-86-7180), не как (012867180).
■ Маски предупреждают ошибки. Они отбрасывают символы, не соответствующие шаблону. Если вы пользуетесь маской для ввода номеров телефонов, то не сможете ввести буквы.
■ Маски устраняют путаницу. Одни и те же данные многих типов можно представить несколькими способами. Вы можете ввести номера телефонов с междугородним кодом и
без него. Используя маску с символами-заполнителями для междугороднего кода, выдаете понять, что эта информация обязательна (а также показываете, где она должна располагаться). Очевидно, что вам не нужно набирать скобки или дефисы для разделения номеров, поскольку эти детали уже стоят в нужном месте. Такие же преимущества маски дают при вводе дат, которые можно ввести разнообразными способами (Год/Месяц/День, Месяц-День-Год и т. д.).
Маски подходят как нельзя лучше для сортировки числовой информации в текстовом поле. Этот сценарий реализуется с самыми разными данными, включая номера кредитных карт, почтовые индексы и номера телефонов. Данные этих типов не следует хранить в числовых полях, поскольку они не должны интерпретироваться как единый номер. Их следует воспринимать как последовательность цифр. (Если вы допустите ошибку и сохраните номер телефона в числовом поле, то обнаружите, что пользователи могут ввести совершенно бессмысленные номера, такие как 0 или -14, поскольку это примеры корректных чисел, несмотря на то, что их нельзя считать допустимыми номерами телефонов. Маска в текстовом поле вылавливает с легкостью подобные ошибки.)
Маска не помогает бороться с более сложными проблемами, такими как значения с переменной длиной или хитроумными шаблонами. Например, маска не поможет определить неправильный адрес электронной почты.
Примечание
Маски поддерживают только типы данных Текстовый и Дата/время.
Применение готовых масок
Легче всего начать использование масок с применения одной из разнообразных подготовленных масок, предлагаемых программой Access. Это замечательный способ, т. к. не требует изучения таинственного искусства создания масок.
Далее перечислены действия, необходимые для выбора встроенной маски.
1.
В Конструкторевыберите текстовое поле, в котором вы хотите применить маску.
В данном примере используйте поле PhoneNumber.
2. Найдите свойство поля Маска ввода(Input Mask), щелкните кнопкой мыши в поле этого свойства.
В этот момент у правого края поля появится маленькая кнопка (...) со скругленными углами, показанная на рис. 4.9.
Рис. 4.9. С помощью кнопки (...) со скругленными углами программа Access сообщает о том, что вы не должны вводить значение вручную. Вместо этого можно щелкнуть мышью кнопку и вывести на экран программу-мастер (например, Мастер создания масок ввода) или другую разновидность полезного диалогового окна
3. Щелкните мышью эту кнопку.
Запустится Мастер создания масок ввода (рис. 4.10).
4. Выберите нужную вам маску из списка возможных вариантов.
В данном случае выберите первый элемент списка (Phone Number).
Примечание
Не нравится то, что получается? Тогда вам нужно создать собственную маску, пользуясь советами из разд. "Создание собственной маски" далее в этой главе. Если вы нашли близкую, но не идеальную готовую маску, выберите ее. Вы сможете откорректировать ее во втором окне данного мастера.
5. Щелкните мышью кнопку Далее (Next).
На экране появится второе окно мастера (рис. 4.11).
6. Если хотите, можно изменить маску или символ-заполнитель в ней.
Для изменения маски вам придется узнать, что означает каждый символ маски. Вы найдете их описание в табл. 4.2.
Символы-заполнители применяются для обозначения пустых позиций, в которые вводится информация. Стандартный заполнитель — символ подчеркивания (_). Иногда
можно использовать пробел, дефис, звездочку или любой другой символ, введя его в иоле Заполнитель(Placeholder character).
Рис. 4.10. Мастер создания масок ввода выводит на экран список общеупотребительных масок. Рядом с каждой маской приведен пример отформатированного маской значения. После выбора маски можно опробовать ее в текстовом поле Проба,в котором вы увидите, как будет вести себя ваше поле, если в нем применить маску
Рис. 4.11. Для телефонного номера применяется маска !(999) 000-000. Каждая цифра 9 обозначает необязательную цифру от 0 до 9. Каждая цифра 0 представляет обязательную цифру от 0 до 9. Итак, в соответствии с данной маской (123) 456-7890 — правильный номер телефона, как и 123-4567, а номер (123) 456 — неправильный
7. Щелкните мышью кнопку Далее.
Если вы вставляете маску в текстовое поле, на экран выводится завершающее окно мастера (рис. 4.12).
Если вы включаете маску в поле с датами, программе Access не нужно знать, как вы будете хранить информацию в поле — она уже знает это. В этом случае вы можете перейти к пункту 9 и щелкнуть мышью кнопку Готово(Finish).
Рис. 4.12. В завершающем окне мастера можно выбрать способ хранения данных в вашем поле — с символами маски или без них
8. Укажите, как вы хотите хранить значение в данном поле.
Обычно хранятся только вводимые символы (другими словами, все, что вы вводите в поле). Если вы выбираете этот вариант, символы-заполнители в поле не включаются. Например, телефонный номер (416) 123-4567 хранится как 4161234567. Этот вариант экономит немного дискового пространства и позволяет вам изменить маску в дальнейшем для несколько иного представления данных.
Вы могли бы сохранить маску полностью со всеми дополнительными символами. В этом случае номер телефона хранился бы с дефисами, знаками подчеркивания и пробелами, например, (416) 123-4567. Это менее гибкий подход, поскольку не позволяет изменять маску впоследствии.
9. Щелкните мышью кнопку Готово.
Окончательная маска выводится в поле свойства Маска ввода(Input Mask). Прежде чем двигаться дальше, возможно, вы хотите убедиться в том, что зарезервированная длина поля соответствует маске. В примере с номером телефона Размер полядолжен быть 10, если выбрано хранение неформатированного значения (поскольку в номере 10 цифр), или 14, если выбрано хранение полной маски вместе с заполнителями (один дефис, один пробел и две скобки).
10. Перейдите снова в Режим таблицы и щелкните мышью кнопку Да, когда программа Access предложит сохранить изменения. Теперь ваша маска ввода подготовлена.
Примечание
Программа Access использует информацию маски ввода для управления способом ввода данных в таблицу. Но маску можно перехитрить и ввести данные по-другому. Вы могли бы создать форму (как описано в части IV) и отключить маску. Маска не обеспечивает стопроцентной защиты от некорректных данных, если вам нужна полная гарантия, вместо маски нужно применять правило верификации (validation rule).