рис. 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}.

 

 

Столбец “Доп. Инф.” содержит число строк в таблице, а “Вес” – приоритет поля для анализа.