logo
TurboProlog / Документация / TOM_1

Изменение структуры базы данных.

Одним из способов изменения структуры базы данных является копирова-

ние старой базы данных в новую с внесением изменений. Другой путь, опи-

санный ниже, заключается в том, чтобы выгрузить базу данных в текстовый

файл, внести изменения с помощью редактора текста, а затем считать базу

данных обратно в обновленном виде.

Предикат dumpdba, описанный ниже, предназначен для выгрузки базы

данных в текстовый файл, если база данных удовлетворяет следующим услови-

ям:

- каждая цепочка в базе данных моделирует отношение;

- все элементы базы данных принадлежат одному домену;

Эта методика не требует выгрузки B-деревьев в текстовый файл, мы

предполагаем, имея ввиду первое условие, что B-дерево может быть порожде-

но из отношений. В этом примере все термы принадлежат родовому домену

mydom, в момент применения можно заменить mydom на требуемое имя домена и

соответствующее его объявление.

Эта программа записывает содержание базы данных в текстовый файл,

открытый предикатом outfile.

Каждая строка текстового файла содержит терм и имя содержащей его

цепочки. Имена цепочки и терма записываются в сложный объект домена

chainterm.

/* Программа CH1SEX06.PRO */

domains

db_selector = myDba

chainterm = chain(string, mydom)

file = outfile

mydom = city(zipcodf, cityname);

person(firstname, lastname, street, zipcode, code)

zipcode, cityname, firstname, lastname = string

street, code = string

predicates

wr(chainterm)

dumpDva(string,string)

clauses

wr(X) :-write(X), nl.

dumpDva(Db_selector, OutFile) :-

db_open(myDba, Db_selector, in_file),

openwrite(outfile, OutFile),

writedevice(outfile),

db_chains(myDba, Chain),

chain_terms(myDba, Chain, mydom, Term, _),

wr(chain(Chain, Term)),

fail.

dumpDva(_, _) :-

closefile(outfile),

db_close(myDba).

goal

dumpDva("\\programs\\register.bin", "register.txt").

Используя приведенную выше программу, можно сгенерировать текстовый

файл. И вы можете перегрузить базу данных, используя предикат readterm

для домена chainterm. Предикат dba_insert, определенный в разделе "Обнов-

ление базы данных", производит это обновление.

domains

chainterm = chain(string, dbdom)

predicates

nondeterm repfile(file)

copyDba

loadDba(string)

clauses

repfile(_).

repfile(File) :- not(eof(File)),repfile(File).

loadDba(OutFile) :-

openread(Prn_file, OutFile),

readdevice(Prn_file),

repfile(Prn_file),

readterm(Chainterm, chain(Chain, Term)),

write(Term),nl,

Dba_insekt(Chain, Term),

file.

loadDba(_) :-

closefile(Prn_file).

copyDba :-

createDba,

db_open(Dba, "redister.bin", in_file),

open_indices,

loadDba("redister.txt"),

db_close(Dba).

Обзор

Система внешней базы данных Турбо Пролога добавляет силу, скорость и

эффективность к применению вашей базы данных. Основные вопросы, затрону-

тые в этой главе:

1) Термы внешней базы данных запоминаются в цепочках, к которым

вы можете получить прямой доступ с помощью указателей базы дан-

ных; эти указатели принадлежат к предопределенному домену ref.

2) Индивидуальность баз данных идентифицируется селекторами ба-

зы данных, принадлежащими к стандартному домену db_selector.

3) Вы можете хранить базу данных в трех местах, в зависимости

от аргумента, принадлежащего к предопределенному домену place.

a) in_file помещает базу данных в файл на диске.

б) in_memory помещает ее в оперативную память.

в) in_ems помещает ее в память EMS-типа.

4) Если вы хотите сортировать термы в базе данных, то следует

использовать B-деревья. Как и базы данных, B-деревья обознача-

ются селекторами, принадлежащими к стандартному домену bt

_selector.

5) Каждый вход в узел B-дерева содержит строку key (ключ) (так-

же называемую index), которая идентифицирует запись, и указа-

тель базы данных, который связан с этой записью.

6) Ключи B-дерева сгруппированы в страницы, и число ключей, со-

держащихся в одном узле, определяется порядком (order) дерева.