Другие журналы

научное издание МГТУ им. Н.Э. Баумана

НАУКА и ОБРАЗОВАНИЕ

Издатель ФГБОУ ВПО "МГТУ им. Н.Э. Баумана". Эл № ФС 77 - 48211.  ISSN 1994-0408

Преобразование заполненных таблиц к первой нормальной форме

#2 февраль 2007

УДК 681.3.07

                                                                                                  А.В. Брешенков

 

В работах [1-3] обоснована актуальность проблемы преобразования заполненных нереляционных таблиц в реляционные таблицы, сформулированы задачи преобразования, намечены пути решения отдельных задач. Здесь рассматривается одна из этих задач - избавление от сложных атрибутов в заполненных нереляционных таблицах. Простые атрибуты - это первое условие нормализации реляционных таблиц [4]. При проектировании таблиц баз данных это условие закладывается изначально. В нереляционных таблицах или в данных табличного вида оно, как правило, не обеспечивается.  

Для того чтобы исключить подзаголовки 1-го и 2-го уровней и не потерять смысл атрибутов можно выполнить конкатенации заголовков и подзаголовков всех уровней и значениям подзаголовков нижнего уровня приписать значения конкатенации. После этого необходимо удалить строки с заголовками 1-го и, если есть таковые, строки с заголовками 2-го уровня. Этот процесс можно формализовать  и соответственно реализовать его в виде машинных процедур. Однако полностью исключить участие человека из процесса преобразования данных табличного вида к реляционному виду удается не всегда, поэтому речь идет о человеко-машинных процедурах.

       Для формализации процесса избавления от сложных атрибутов определим необходимые понятия.

       Ячейка – это фрагмент таблицы, который имеет четыре ограничителя: верхний, нижний, левый и правый. В зависимости от формата представления данных табличного вида в качестве ограничителей могут выступать пробелы, символы табуляции, точки, вертикальные линии, горизонтальные линии или другие специальные символы. В электронных таблицах ячейка имеет адрес. В связи с этим, одной из причин участия человека в процессе преобразования, является необходимость указания им символов ограничителей ячеек. Ячейка характеризуется номером строки таблицы данных и номером в строке. Таким образом, Яij - это область таблицы, выделенная ограничителями, находящаяся в i-ой строке таблицы и занимающая j-ю позицию. ЛГ(Яij) – левый ограничитель Яij; ПГ(Яij) – правый ограничитель Яij; УГ – указатель на правую или  левую границу ячейки. С(Яij) – содержимое ячейки; СТii-ая строка.

          Алгоритм избавления от сложных атрибутов выглядит следующим образом:

П1:            {Подсчет числа ячеек в 1-ой, 2-ой, и 3-ей строках таблицы.}

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

                   М1 := 1;

                   УГ :=  ЛГ(Я11);

                   WHILE ПГ(Я1М1) not EMPTY M1 := M1 + 1;

                   М2 := 1; 

                   УГ := ЛГ(Я21);

                   WHILE ПГ(Я2М2) not EMPTY M2 := M2 + 1;

                   М3 := 1;

                   УГ := ЛГ(Я31);

                   WHILE ПГ(Я3М3) not EMPTY M3 := M3 + 1;

                   IF М2 = М1 THEN GOTO П4;  {нет подзаголовков}

                   IF (М2 > М1) and (M2 = M3)  THEN GOTO П2;  

                   IF М3 > М2 THEN GOTO П3;  

                   {один уровень подзаголовков}

П2:             k := 1; 

                   j := 1;

                   УГ:= ЛГ(Я21);

                   WHILE  j  <>  M2

                        WHILE ПГ(Я1K) <> ПГ (Я2J)

                  C2J)= Concat(C1K),'   ',C2J));

                 j := j + 1;

            END WHILE;

            k := k + 1;

            j := j + 1;

      END WHILE;

                  DELETE CT1;

                  GOTO П4;

                 {два уровня подзаголовков}

П3:            к := 1;

                  n := 1;

                  j := 1;

                  WHILE  j  <>  M3

                       WHILE ПГ(Я2n) <> ПГ (Я3j)

                  C3j) = Concat(C1k),'   ',C2n),'   ',C3j));

                   j := j + 1;

            END WHILE;

                        IF  ПГ(Я1k) = ПГ(Я3j) THEN k :=k + 1;

             n := n + 1;

                        j := j + 1;

                  END WHILE;

                  DELETE CT1;

                  DELETE CT2;

П4:            END.

         Нетрудно заметить, что многие команды алгоритма несколько напоминают команды языка программирования Pascal. Так сделано в связи с тем, что при исключении подзаголовков очень вероятна работа с текстовыми файлами, сам алгоритм неочевиден и оправданна его изначальная ориентация на предполагаемый язык реализации.

В алгоритме задействован оператор DELETE, применение которого реализует удаление строк. В П2 удаляется 1-ая строка  CT1 со сложными атрибутами. В П3 удаляется 1-ая и 2-ая строки (CT1 , CT2)  со сложными атрибутами.  Следует обратить внимание, что алгоритм предназначен для реализации в человеко-машинных процедурах. Это связано с тем, что сформированные в соответствии с алгоритмом атрибуты могут быть длинными и не удовлетворять требованиям инструментальной СУБД. Они могут оказаться семантически избыточными и нуждаться в корректировке. Кроме того, в атрибутах могут быть символы, недопустимые с точки зрения инструментальной СУБД. В качестве таких символов могут выступать “!”, “.”, “@” и другие. В связи с этим при реализации алгоритма необходимо предусмотреть автоматизированное исключение из атрибутов символов, указанных пользователем.

        Нетрудно доказать, что алгоритм корректный, т.е. алгоритм сходится. П1 алгоритма конечен, так как число ячеек любой строки таблицы данных ограничено. П2 и П3 также конечны, так как циклы, которые в них задействованы, ограничены фиксированными значениями параметров.

       Кроме того, алгоритм обладает малой вычислительной сложностью, которую можно оценить следующим образом. Для П1 максимальное число итераций оценивается как N*3, где N – число простых атрибутов или количество ячеек в строках с данными или степень таблицы данных. Для П2 и П3 максимальное число операций N. Так как П2 и П3 алгоритма альтернативны, то общая вычислительная сложность алгоритма N*4, т.е. линейна. Причем значение коэффициента невелико.

         Нетрудно показать, что таблица, полученная в результате работы алгоритма, удовлетворяет 1-ой нормальной форме. Действительно, в соответствии с требованиями алгоритма (П1), преобразование сложных атрибутов в простые начинает выполняться, когда количество атрибутов (заголовков) будет равным числу элементов в строке с данными - N. Если бы в результате выполнения алгоритма атрибуты остались  сложными, то количество заголовков должно было получиться меньшим количества элементов в строке с данными, а это противоречит предыдущему высказыванию. Таким образом, число атрибутов после выполнения алгоритма соответствует количеству ячеек в строках с данными и эти атрибуты неделимы. Кроме того, в соответствии с пунктами алгоритма (П2, П3) вся необходимая информация о семантике столбцов собирается и сохраняется в простых атрибутах. В связи с этим после удаления строк со сложными атрибутами смысловое назначение столбцов таблицы  не утрачивается.

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

Иногда для решения проблемы избавления от сложных атрибутов оправданно использование существующих инструментальных средств. Рассмотрим пример таких средств. В качестве исходной таблицы рассмотрим фрагмент реальной таблицы, сформированной в Microsoft Excel, представленный на рис. 1.

Рис. 1. Исходная таблица со сложными атрибутами

 

Как видно из рис. 1,  в таблице имеются два сложных атрибута - “Тип оборудования” и ”Цена”. Выполним импорт этой таблицы в СУБД Access. Для этого используется меню Файл/Внешние данные/Импорт. В процессе выполнения шагов мастера импорта указывается лист рабочей книги Microsoft Excel, назначается строка заголовка, имя создаваемой таблицы. Окно мастера на его очередном шаге имеет вид рис 2.

 

Рис. 2. Окно мастера импорта таблиц

 

При выполнении следующих шагов мастера можно назначить индексные поля, в отдельных случаях можно назначить типы полей, назначить ключевое поле. В результате выполнения всех шагов мастера исходная таблица в формате Microsoft Access примет вид рис 3.

 

Рис. 3. Исходная таблица в формате Microsoft Access

 

Даже из поверхностного анализа заголовков таблицы и содержимого полей видно, что в таком виде таблица неприемлема для использования в базе данных. В связи с этим, для избавления от сложных атрибутов необходимо сформировать простые заголовки и избавиться от подзаголовков, которые попали в значения атрибутов. В значения атрибутов, как видно из рис. 3  попали части и некоторых простых заголовков.

Редактирование заголовков реализуется, когда таблица  открыта в режиме Конструктора; редактирование полей таблицы реализуется, когда таблица  открыта в режиме Просмотра.

После выполнения необходимых действий в режиме Конструктора и  в режиме Просмотра таблица примет вид рис. 4.

Рис. 4. Преобразованная таблица в формате Microsoft Access

Для рассмотренного фрагмента таблицы описанные выше манипуляции не составили большого труда. Однако даже эта таблица в полном объеме включает в себя более сорока полей, причем многие из них входят в состав сложных атрибутов. Нередко встречаются таблицы с несколькими сотнями столбцов, в этом случае рассмотренные мероприятия могут оказаться нетривиальными.

Исключение подзаголовков, расположенных внутри таблицы

Информация табличного вида нередко представлена таким образом, что заголовки (атрибуты) таблицы чередуются со значениями атрибутов. Другими словами то, что должно использоваться в качестве заголовков таблицы используется в качестве их значений. Это недопустимо в таблицах, используемых в реляционных БД. От такого положения вещей следует избавляться. Рассмотрим пример, приведенный в табл. 1.

                                                                  Т а б л и ц а  1

Оборудование

Цена

Количество

Москва, Подмосковье

Эскалаторы

50000

9

Траволаторы

70000

11

Лифты

40000

7

Моторы

7000

77

Сибирь, Урал

Эскалаторы

40000

5

Траволаторы

60000

9

Лифты

30000

5

Таблицу такого рода невозможно обрабатывать с помощью языка запросов.

В связи с этим эту таблицу оправданно представить в виде 2-х связанных реляционных таблиц: ”Продажи” и “Регионы”.

Предлагается следующая последовательность действий. Формируется новый столбец с номерами регионов. Сканируется преобразованная таблица, очередному региону присваивается номер, и этот номер распространяется на товары, проданные в данном регионе. Затем из записей с  регионами формируется новая таблица, соответствующие записи  из исходной преобразованной таблицы удаляются. После этих преобразований будут сформированы 2-е таблицы, связанные между собой связью типа 1: ¥. Проиллюстрируем вышесказанное на примере.

Результат формирование нового столбца с номерами регионов и заполнением столбца приведен в таблице 2.

                                                                                        Т а б л и ц а 2

Оборудование

Цена

Количество

1

Москва, Подмосковье

1

Эскалаторы

50000

9

1

Траволаторы

70000

11

1

Лифты

40000

7

1

Моторы

7000

77

2

Сибирь, Урал

2

Эскалаторы

40000

5

2

Траволаторы

60000

9

2

Лифты

30000

5

m

m

 

Результат Формирования новой таблицы регионов и исключения записей с регионами из исходной таблицы приведены соответственно в  табл. 3  и табл. 4.                                          

                                   Т а б л и ц а  3

Регион

1

Москва, Подмосковье

2

Урал, Сибирь

m

                                                                                      Т а б л и ц а  4

Оборудование

Цена

Количество

1

Эскалаторы

50000

9

1

Траволаторы

70000

11

1

Лифты

40000

7

1

Моторы

7000

77

2

Эскалаторы

40000

5

2

Траволаторы

60000

9

2

Лифты

30000

5

m

 

Для таблиц данного вида вполне можно строить реляционные запросы.

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

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

Предварительно представим таблицу (отношение)  рассматриваемого типа в общем виде (табл. 5).

                                Т а б л и ц а  5

A1

...

Ai

...

Ak

a11

...

NULL

...

NULL

a21

...

a2i

...

a2k

aj1

...

NULL

...

NULL

...

...

af1

...

NULL

...

NULL

am1

...

ami

...

amk

 

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

Неформальный алгоритм исключения подзаголовков состоит в следующих действиях.

П1: Выполняется сканирование всех записей отношения R. Каждая запись проверяется на наличие в ней только одного значения атрибута. Записи такого рода подсчитываются. Если таких записей несколько, то подзаголовки в отношении R присутствуют и выполняется переход к следующему пункту (П2). В противном случае алгоритм завершает работу.

П2: К отношению R приписывается дополнительный атрибут KR с типом ”числовой” (формируется R'),.

COUNTER := 0;

П3: Выполняется сканирование всех записей отношения R'. Если в записи имеется только одно заполненное значение атрибута, то счетчик подзаголовков COUNTER увеличивается на 1.

Значению атрибута KR присваивается значение COUNTER.

П4: Создается новое отношение R2, включающее в себя 2-а атрибута NR и атрибут с подзаголовком.

Выполняется сканирование всех записей отношений R'. Записи, которые имеют только одно, кроме ключевого, заполненное значение атрибута перемещаются в отношение R2.

В результате выполнения алгоритма сформируются отношение R2 (с подзаголовками исходной таблицы) и отношение R1 без подзаголовков. Связи между таблицами обеспечиваются посредством ключевых атрибутов KR, которые присутствуют в обоих отношениях.

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

COUNTER  = 0

FOR r = 1 то m

     COUNTER1  = 0

     FOR f = 1 то k

         IF ark = NULL THEN    COUNTER1 = COUNTER1 + 1

     NEXT f

     IF COUNTER1 = k-1 THEN COUNTER = COUNTER + 1

NEXT r

IF COUNTER < 2 THEN EXIT

        REM Формирование  двух отношений

R’ = R (A1, …, Ai, …, Ak) + R (KR)

COUNTER  = 0

FOR r = 1 то m

     COUNTER1 = 0

     FOR f = 1 то k

        IF ark = NULL THEN COUNTER1 = COUNTER1 + 1

     NEXT f

    IF COUNTER1 = k - 1 THEN

         COUNTER = COUNTER + 1

         Z(R2 COUNTER,1) = COUNTER

         Z(R2 COUNTER,2) = ark

         DELETE * FROM R’  WHERE (A1 = ark)

    ELSE

         Z(R’r, 1) = COUNTER

    END IF

NEXT r

Здесь m-мощность R.

k – степень R.

Выражение R’ = R + R (KR) означает добавление к R атрибута с именем KR.

Выражение Z(R2COUNTER,1)  означает значение элемента R2 в строке COUNTER и 1-м столбце.

 Выражение Z(Rr, 1) означает значение элемента R’ в строке r и 1-м столбце.

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

Назначение таблицы на преобразование – прерогатива разработчика. Более того, после принятия решения о преобразовании могут потребоваться действия разработчика, связанные с приведением исходной таблицы к регулярному виду. Кроме того, от разработчика потребуются усилия по формированию связей между полученными таблицами. Способы наведения связей зависят от инструментальной СУБД. В связи с этим предлагаемый метод нельзя назвать автоматическим, он – автоматизированный.

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

Ø $ sj (sj Î s) " (ajt = NULL) (ajt Îsj),

j = 1, m; t = 1, k-1.

Здесь s – множество строк таблицы.

ajt – значение t-го атрибута в j-й строке.

 m – мощность таблицы; k – степень таблицы.

Иногда для избавления от заголовков внутри таблицы оправданно использование существующих средств. Рассмотрим пример таких средств. В качестве исходной таблицы рассмотрим фрагмент реальной таблицы сформированной в Microsoft Excel, представленный на рис. 5.

 

Рис. 5. Фрагмент таблице в формате Microsoft Excel с заголовками внутри таблицы

 

После импорта данной таблицы в формат БД Microsoft Access она примет вид, представленный на рис. 6

Рис. 6. Результат импорта таблицы в СУБД Microsoft Access

 

Нетрудно заметить, что заголовки, расположенные внутри таблицы, превратились в значения ячеек с заголовком ”Регион”.

Для приведения таблицы к приемлемому виду можно в режиме Конструктора определить новый столбец ”Месяц”, а потом в режиме Просмотра этот столбец вручную заполнить. Результат такого преобразования представлен на рис. 7.

 

Рис. 7. Преобразованная таблица

 

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

Использование рассмотренных средств нетрудоемко и оправданно, когда таблица включает в себя несколько десятков записей. Реальные же таблицы нередко включают в себя десятки тысяч записей. В этом случае такого рода преобразование таблиц трудоемко и может привести к ошибкам.

Эта же самая таблица, импортированная в  формат Microsoft SQl Server, выглядит следующим образом (рис 8). 

 

Рис. 8. Результат импорта таблицы в СУБД Microsoft SQl Server

 

Результат импорта таблицы в БД Microsoft SQl Server внешне несущественно отличается от результата импорта таблицы в БД Microsoft Access (рис. 7). Однако из рисунка видно, что незаполненные ячейки явно представлены значением ”NULL”. Такое представление незаполненных ячеек выгодно отличается от представления незаполненных ячеек в СУБД Microsoft Access. Дело в том, что в СУБД Microsoft Access незаполненные ячейки и пустые строки (””) отображаются одинаково – пустыми ячейками. Таким образом, в СУБД Microsoft Access визуально невозможно определить содержит ли ячейка данные или нет. Пустая строка является данными.  Значение ”NULL” свидетельствует об отсутствии данных. В рассматриваемом случае это важно, так как именно отсутствие данных в определенных ячейках позволяет принять решение о необходимости нормализации таблицы на основе использования стандартных средств СУБД. Таким образом, в качестве инструментальных средств, используемых для приведения таблиц к 1-й нормальной форме,  предпочтительно применение средств СУБД Microsoft SQl Server.

Но в любом случае приведение реальных заполненных таблиц к 1-й нормальной форме с помощью инструментальных средств СУБД задача трудоемкая и чревата внесением ошибок. Поэтому для нормализации таблиц большой размерности рекомендуется использование специализированных программных средств, реализованных в соответствии с предложенными алгоритмами.

 

Литература

 

1.    Брешенков А.В. Неформальная постановка проблемы преобразования   информации  табличного вида в файлы баз данных.  Сб. трудов АУ МВД  России "Актуальные вопросы технологий в деятельности органов внутренних дел". - М.: 2004. – 20 с.

2.  Брешенков А.В., Бараков Д.Д. Вопросы преобразования электронных таблиц в таблицы реляционных баз данных. Современные информационные технологии. Cб. трудов каф. ИУ-6, посвященный 175-летию МГТУ им. Н.Э. Баумана. - М.: Эликс +, 2004. – 15 с.

3.  Брешенков А.В., Бараков Д.Д. Методика назначения ключевых полей в заполненных реляционных таблицах. Современные информационные технологии. Cб. трудов каф. ИУ-6, посвященный 175-летию МГТУ им. Н.Э. Баумана. - М.: Эликс +, 2005. – 16 с.

4.  Гэри Хансен, Джэймс Хансен. Базы данных: разработка и управление. : Пер. с англ. - М.: Бином, 1999. – 699 с.

 

Поделиться:
 
ПОИСК
 
elibrary crossref ulrichsweb neicon rusycon
 
ЮБИЛЕИ
ФОТОРЕПОРТАЖИ
 
СОБЫТИЯ
 
НОВОСТНАЯ ЛЕНТА



Авторы
Пресс-релизы
Библиотека
Конференции
Выставки
О проекте
Rambler's Top100
Телефон: +7 (915) 336-07-65 (строго: среда; пятница c 11-00 до 17-00)
  RSS
© 2003-2024 «Наука и образование»
Перепечатка материалов журнала без согласования с редакцией запрещена
 Тел.: +7 (915) 336-07-65 (строго: среда; пятница c 11-00 до 17-00)