воскресенье, 29 мая 2016 г.

MUMPS: Простой индекс

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

Наличие такого быстрого отображения и реализует способ быстрого поиска записи по значению атрибута. Положим, что в нашем случае записи имеют структуру
 ^Data(id)=Figure~Color~Count
Тогда при наличии индекса по фигуре мы должны поддерживать актуальность дополнительной структуры данных
 ^Index(Figure,id)=""
Эта структура позволяет, задав значение фигуры, получить набор идентификаторов записей, в которых встречается это значение фигуры. В случае поддержки нескольких индексов, конечно, структура должна быть усложнена:
 ^Index("Figure",Figure,id)=""
 ^Index("Color",Color,id)=""
 ^Index("Count",Count,id)=""
с целью повторного использования имени индексной глобали.

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

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

Небольшой пример реализации простых индексов:
ind01 ; простые индексы, автоматический идентификатор
 q
CreateRecords()
 k ^Index
 k ^Data
 n i,Figures,Colors,Counts,Figure,Color,Count,id
 s Figures="квадрат~круг~отрезок~треугольник"
 s Colors="красный~зелёный~синий~белый"
 s Counts="2~5~12~8"
 f i=1:1:12 d
 . s Figure=$p(Figures,"~",$r(4)+1)
 . s Color=$p(Colors,"~",$r(4)+1)
 . s Count=$p(Counts,"~",$r(4)+1)
 . s id=$$InsertRecord(Figure_"~"_Color_"~"_Count)
 q
InsertRecord(RecordValues)
 n id s id=$i(^Data)
 l +^Data(id)
 s ^Data(id)=RecordValues
 d InsertIndexRecords(id,RecordValues)
 l -^Data(id)
 q id
DeleteRecord(id)
 q:'$d(^Data(id))
 l +^Data(id)
 n RecordValues s RecordValues=$g(^Data(id))
 d DeleteIndexRecords(id,RecordValues)
 k ^Data(id)
 l -^Data(id)
 q
UpdateRecord(id,RecordValues)
 q:'$d(^Data(id))
 l +^Data(id)
 n OldRecordValues s OldRecordValues=$g(^Data(id))
 d DeleteIndexRecords(id,OldRecordValues)
 s ^Data(id)=RecordValues
 d InsertIndexRecords(id,RecordValues)
 l -^Data(id)
 q
DeleteIndex(IndexName)
 k ^Index(IndexName)
 q
InsertIndexRecords(id,RecordValues)
 d InsertIndexRecord("Figure",id,$p((RecordValues),"~",1))
 d InsertIndexRecord("Color",id,$p((RecordValues),"~",2))
 d InsertIndexRecord("Count",id,$p((RecordValues),"~",3))
 q
DeleteIndexRecords(id,RecordValues)
 d DeleteIndexRecord("Figure",id,$p((RecordValues),"~",1))
 d DeleteIndexRecord("Color",id,$p((RecordValues),"~",2))
 d DeleteIndexRecord("Count",id,$p((RecordValues),"~",3))
 q
InsertIndexRecord(IndexName,id,Value)
 l +^Index(IndexName,Value,id)
 s ^Index(IndexName,Value,id)=""
 l -^Index(IndexName,Value,id)
 q
DeleteIndexRecord(IndexName,id,Value)
 l +^Index(IndexName,Value,id)
 k ^Index(IndexName,Value,id)
 l -^Index(IndexName,Value,id)
 q


Подробнее о книге "MUMPS СУБД"

Комментариев нет:

Отправить комментарий