В.Н.Лукин. Базы данных. Конспект лекций, ред 3.51, 08.12.09
Инвертированные списки
Два предыдущих метода ориентировались, в основном, на поиск записей с уникальным
значением ключа. Однако нередко возникает задача выбора группы записей по опреде-
ленным параметрам, каждый из которых не уникален. Более того, записей с каким-то
фиксированным значением параметра может быть очень много. Это характерно, на-
пример, для библиотечного поиска, когда требуется подобрать книгу с заданным годом
издания, автором, издательством и т.п. Для подобных задач существуют специальные
методы, наиболее популярный из которых – метод инвертированных списков или ин-
вертированный метод.
Считается, что поиск может проводиться по значениям любых полей (вторич-
ных ключей) или их комбинации. Для каждого вторичного ключа создается индекс. В
нем на каждое значение ключа формируется список указателей на записи файла с этим
значением. Это не обязательно физическая ссылка, допускается и первичный ключ.
Таким образом, инвертированный индекс группируется по именам полей, которые в
свою очередь группируются по значениям. При поиске записи с заданным значением
ключа выбирается нужный индекс, в нем каким-то способом (например, индексно-
произвольным) выбирается статья с этим значением, затем выбирается весь список
ссылок на записи с искомым значением. Дальнейший выбор записей с одинаковым
значением вторичного ключа производится по ссылкам, содержащимся в выбранном
списке.
Легко видеть, что поиск по комбинации значений полей сводится к выбору со-
ответствующих списков и их пересечению (операция И) или объединению (операция
ИЛИ). Действительно, в пересечении списков содержатся ссылки на записи, удовле-
творяющие обоим критериям, а в объединении – хотя бы одному. Критерии могут
включать как условия на один ключ, так и на разные. При этом можно использовать не
только равенство, но и другие операции отношения. Например, для выбора книг Пуш-
кина, изданных в 1949 году, следует взять пересечение списков «автор = Пушкин» и
«год издания = 1949». Выбор книг, изданных позже 2005 года производится по объеди-
нению списков, определенных отношением «год издания > 2005».
Более эффективна работа со списками при использовании метода битовых карт,
который тоже предназначен для работы с вторичными ключами. Во многом он эквива-
лентен предыдущему, только вместо списков используются битовые шкалы, длина ко-
торых равна количеству информационных записей. Наличие единицы в позиции N оз-
начает, что в N-й записи значение соответствующего ключа совпадает с искомым зна-
чением, наличие нуля – нет. Очевидно, что объединение всех битовых шкал для всех
значений заданного ключа дает шкалу, состоящую из одних единиц. В этом методе
вместо работы со списками выполняются логические операции с битовыми шкалами.
Для выбора искомых записей следует пробежать результирующую битовую шкалу и
отобрать записи, номера которых равны позициям шкалы, содержащим единицы. Этот
метод хорош, когда количество различных значений вторичных ключей, а значит, и
шкал, невелико. В этом случае среднее количество единиц в шкале достаточно велико,
что повышает эффективность работы. Заметим, что в предыдущем методе в таких ус-
ловиях удлиняются списки, что, наоборот, снижает эффективность. Особенно удобно
использовать битовые карты при задании сложных условий выбора: операции над би-
товыми шкалами гораздо проще и быстрее, чем со списками. Понятно, что с ростом
количества информационных записей и количества различных вторичных ключей эф-
фективность этого метода падает, особенно эффективность хранения.
Достоинства метода – независимость от объема файла при выборе данных по
произвольным значениям ключа, отбор списка записей по сложным условиям без об-
ращения к файлу. Особенно эффективно применение инвертированных списков при
выборке данных по совокупности критериев, если атрибуты имеют сравнительно не-