рис. 1. Броузер для полей и таблиц рабочей базы (торговое предприятие)
Первичная информация о схеме базы данных фиксируется в таблицах, иллюстрируемых броузером на рис. 1.
Имена таблиц и полей рабочей базы, а также сведения о типе и ЕЯ-наименовании извлекаются из системного каталога. Данные о первичных и внешних ключах выдвигаются системой в качестве предположений. При этом “no” означает, что поле НЕ МОЖЕТ быть первичным ключом в этой таблице, а “yes” означает, что МОЖЕТ (но не обязательно является, возможны конкурирующие поля).
Простая подпрограмма, получающая на входе имя поля и имя таблицы, приведена ниже. Подпрограмма проверяет, что каждое значение поля имеет единственное значение и фиксирует результат в переменной ind. Кроме того в rez возвращается число строк в таблице с целью использования простой эвристики:
“Большее число строк в таблице увеличивает вероятность первичного ключа для некоторого поля в различных таблицах”.
DEF INPUT
PARAMETER trass AS LOG.
DEF
OUTPUT PARAMETER ind AS LOG.
DEF
OUTPUT PARAMETER rez AS INT.
DEF VAR
ans AS LOG.
DEF VAR
i AS INT.
def buffer new_{1} for {1}.
ind =
yes.
SELECT COUNT(*) INTO i
FROM {1}.
rez =
i.
IF i =
0 THEN DO: /* MESSAGE "пусто!" {vab.i}. */ ind = ?. END.
for
each {1}:
find
new_{1} where new_{1}.{2} = {1}.{2}
no-error.
if
error-status:error then do: ind = no. leave. end.
IF
NOT trass THEN NEXT.
message
"Найден единственный" {1}.{2} {vyn.i}.
IF
NOT ans THEN trass = NO.
end.
IF
trass THEN
IF
ind THEN message "ind = "
ind SKIP "{2} претендент на
ПК ! в {1}" {vab.i}.
ELSE message "ind =
" ind SKIP "{2} не является ПК ! в {1}" {vab.i}.
Столбец “Доп. Инф.” содержит число строк в таблице, а “Вес” – приоритет поля для анализа.