воскресенье, 7 июня 2009 г.

Изучение баз данных средствами программирования

Н. И. Исупова

Изучение баз данных средствами программирования

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

В настоящее время, когда происходит процесс информатизации, главным ресурсом становится информация, а приоритетными оказываются информационные умения человека. В информационном обществе деятельность как отдельных людей, так и коллективов все в большей степени будет зависеть от их информированности и способности эффективно использовать имеющуюся информацию. Как правило, прежде чем предпринять какие то действия, необходимо провести работу по сбору и переработке информации, ее осмыслению и, наконец, выдвижению наиболее рационального решения. Для этого необходима обработка больших объемов данных об объектах реального мира, требующая умений организации, хранения, поиска, сортировки, классификации, систематизации информационных ресурсов. Поэтому для более успешной и эффективной деятельности в современных условиях выпускники школ должны знать основные принципы обработки массивов взаимосвязанных данных, относящихся к некоторой предметной деятельности, то есть основы работы с базами данных, а также уметь осмысленно оперировать объектами систем управления базами данных (СУБД).
Однако анализ существующих методов изучения СУБД показывает, что традиционное обучение не позволяет сформировать соответствующие навыки и умения на должном уровне. Действительно, большинство современных школьных учебников по информатике предлагают изучение баз данных по следующей схеме: сначала рассмотреть основные понятия (таблицы, поля, записи, типы данных, связи и т.д.), а затем изучать основные принципы работы СУБД в конкретной программе, чаще всего, Microsoft Access. При таком обучении школьники в лучшем случае осваивают технологию работы в конкретной СУБД (причем строго в привязке к определенной программе) и приобретают навыки использования готовых процедур обработки информационных массивов данных. Но за бортом их понимания остается механизм организации, поиска, систематизации данных; учащиеся получают лишь представление о сути той или иной операции по обработке информации (что она делает), но не осознают алгоритма ее работы (как она действует). В результате учащиеся не всегда могут эффективно применить свои знания в практической деятельности, особенно, если для обработки данных используется другая, не знакомая им программа. А хотелось бы, чтобы выпускники могли свободно ориентироваться в рамках одной из наиболее востребованных на сегодняшнем рынке труда областей деятельности – работе с разнообразными базами данных.
Достижению этой цели, на наш взгляд, будет способствовать элективный курс по изучению баз данных средствами программирования для классов естественнонаучного профиля. Методика обучения этому курсу основывается на деятельностном подходе, поскольку психолого педагогические исследования последних лет показывают, что основой обучения должна являться не столько система знаний, сколько деятельность учащихся (см., например, [1]). Именно в ходе деятельности учащиеся овладевают ее рациональными приемами и необходимыми для нее знаниями. Важнейшим видом деятельности на уроках информатики в школе является решение задач. Преимущественно при решении задач происходит усвоение школьником знаний, умений и навыков. Методика обучения, при которой задача рассматривается не только как средство закрепления знаний и навыков, но и как средство формирования основных понятий школьного курса, получила название «задачного подхода» [2].
Построенный на задачном подходе курс по изучению СУБД будет способствовать формированию исследовательских умений, умений принимать оптимальные решения, умений работы с информацией, а также развитию коммуникативных способностей учащихся, поскольку элективные курсы связаны, прежде всего, с удовлетворением индивидуальных образовательных интересов, потребностей и склонностей каждого школьника [3]. В рамках такой методики изучение основных, фундаментальных понятий СУБД происходит с использованием программирования через специально разработанную систему задач. Поэтому наряду с сообщением готовых знаний, обучением по образцу, должно использоваться проблемное изложение материала на основе целесообразно подобранных задач.
Для практической реализации курса содержание задач должно в максимальной степени отражать теоретические основы построения и функционирования баз данных. Наиболее распространенной из существующих моделей баз данных является реляционная модель (реляционная СУБД), в которой данные воспринимаются пользователем как таблицы, и в распоряжении пользователя имеются некоторые операторы (реляционные операции), которые генерируют новые таблицы из старых [4]. Таких операций выделяют восемь: традиционные операции над множествами (объединение, пересечение, вычитание, декартово произведение) и специальные реляционные операции (выборка, проекция, соединение и деление). Согласно задачному подходу изучение основ СУБД должно начинаться с рассмотрения алгоритмов работы этих восьми операций. Для этого учащимся предлагаются определенные, специальным образом подобранные задачи, которые им предстоит решить, используя какой либо язык программирования (например, Turbo Pascal). В качестве таких задач могут быть выбраны типичные задания баз данных, большинство из которых сводится к выполнению конечного набора реляционных операций.
Решая подобные задачи в среде программирования, ученики на самом деле реализуют механизм работы операций реляционной алгебры. Такой подход позволяет не только получить качественный материал для отработки и закрепления навыков работы с основными алгоритмическими конструкциями, использования различных алгоритмов поиска и сортировки данных, но и сформировать у учащихся представление об основных понятиях и принципах работы в базах данных. А это значит, что в дальнейшем при работе с конкретными программами СУБД (например, Microsoft Access) ученики будут понимать, как работает та или иная операция и каким образом можно, например, оптимизировать запрос к определенной базе данных.
При такой организации обучения, решая многие задачи баз данных средствами программирования, с одной стороны, появляется возможность получить на первых порах неэффективное и нестрогое с точки зрения организации баз данных решение. С другой стороны, дальнейший анализ решаемых задач позволяет рассматривать вопросы построения более эффективного алгоритма, знакомить учащихся с проблемами анализа и оптимизации алгоритмов.
Здесь важным моментом является организация работы с задачей и построение серии задач. Вопросы и задачи выстраиваются в систему таким образом, что ответ на каждый следующий вопрос и решение каждой следующей задачи приводит к получению небольшого количества нового знания. Практика применения новых знаний происходит не только после их предъявления, но и распределяется по всему курсу. Вопросы и задачи создают проблемные ситуации, порождая мотив к изучению того или иного факта или способа действия, позволяют сделать тот или иной вывод. То есть задания подбираются таким образом, чтобы мотивировать изучение материала и организовать его освоение и закрепление в виде программных реализаций алгоритмов. При этом задачи объединены общей идеей, каждая последующая задача либо обобщает ее, либо конкретизирует ее, либо является ее аналогом, либо использует результат предыдущей задачи.
Так, например, для раскрытия сути реляционных операций по обработке баз данных может быть предложена следующая серия задач.
1. Дан массив данных об абитуриентах факультета информатики, поступавших на определенную специальность (например, «Информатика и английский язык») в прошлом году. Массив содержит следующие данные: № личного дела, фамилия, имя, отчество, дата рождения, адрес, № школы, год окончания школы. Сформировать новый массив, содержащий информацию об абитуриентах: а) окончивших школу № 35; б) проживающих в г. Кирове; в) окончивших школу не позднее 2004 года...
Программная реализация прямого решения задачи не вызывает затруднений. Организовать данные можно, по крайней мере, двумя способами: с помощью двумерного массива строкового типа или с помощью одномерного массива из данных комбинированного типа (записи). Затем идет проверка строк исходного массива на удовлетворение условию задачи и запись подходящий строк в новый массив. Ниже приведена возможная реализация такого алгоритма на языке Паскаль. Здесь исходный массив формируется из файла Table.txt, в котором данные вводятся построчно для каждого абитуриента. Поиск нужных строк осуществляется линейно (прямой поиск).
Program Abiturient;
Uses Crt;
Type TMas= Array [1..7] of string[50];
Massiv= Array [1..30] of TMas; {данные организованы в виде одномерного массива из одномерных массивов строкового типа}
Var cnt, n : byte;
A, B : Massiv;
F : Text;
Procedure Print (A: Massiv; n: byte); {Процедура вывода массива на экран}
Var i, j: byte;
Begin For i:=1 to n do
Begin
For j:=1 to 7 do
Begin
If j in [1,6] Then Write (A[i,j]:4);
If j in [2,4] Then Write (A[i,j]:15);
If j in [3,5] Then Write (A[i,j]:12);
If j in [7] Then Write (A[i,j]:8);
End;
WriteLn;
End;
WriteLn;
End;
Procedure FormMas ; {Процедура формирования массива из файла}
Var i, j : Integer;
Begin
i:=1;
While Not Eof (F) do
Begin
For j:=1 to 7 do Readln (F, A [i, j]);
i:=i+1;
End;
n:=i 1;
End;
Procedure Find (pole: byte; strFind: string); {Процедура поиска строки по заданному условию и записи ее в новый массив В}
Var i, j : Integer;
Begin
cnt:=0;
For i:=1 to n do
Begin
If A [i, pole]=strFind Then
Begin
cnt:=cnt+1;
B [cnt]:=A [i];
End;
End;
End;
{Основная программа}
Begin
cnt:=0;
ClrScr;
Assign (F ,'c:\Zadachi\table.txt');
Reset (F);
FormMas;
Close (F);
Print (A, n);
Find (6, '35'); Writeln ('Результат поиска:');
If cnt<>0 Then Print (B, cnt);
Readln;
End.
Результат работы программы выглядит следующим образом:
Исходный массив данных:
Таблица 1
Результаты поиска:
Таблица 2

Однако если исходный массив данных об абитуриентах содержит достаточно большое количество записей (как это обычно и бывает в реальной базе данных), то при решении задачи возникают проблемы, связанные со временем выполнения алгоритма (временной сложностью). Как известно, временная сложность алгоритма линейного поиска данных имеет порядок О(n2). Таким образом, появляется необходимость оптимизации алгоритма с использованием известных методов сокращения перебора (бинарный поиск, хеширование и т. д.), что делает реализацию алгоритма достаточно интересным и продуктивным занятием.
Так, если использовать, например, бинарный поиск данных, то предварительно нужно отсортировать исходный массив, а следовательно, учащимся нужно будет вспомнить известные им методы сортировки данных в массиве, применить их, не забывая об эффективности алгоритма. Ниже приведено решение задачи с использованием алгоритма быстрой сортировки (сортировка Хоара) и бинарного поиска. Описание и детальный разбор упомянутых методов сортировки и поиска можно найти, например, в учебном пособии [5]. Мы же приводим лишь основную логику программы.
Procedure Sort (pole: byte; m, t: integer); {Процедура сортировки массива по заданному полю (быстрая сортировка Хоара)}
Var W : TMas;
i, j : Integer;
x : String;
Begin
i:=m; j:=t; x:=A [(m+t) Div 2, pole];
Repeat
While A [i, pole] While A [j ,pole]>x Do Dec (j);
If i<=j Then Begin
W:=A [i];
A [i]:=A [j];
A [j]:=W;
Inc (i);
Dec (j);
End;
Until i>j;
If m If i End;
Procedure Find (pole: byte; strFind: string); {Процедура поиска строки по условию (бинарный поиск)}
Var l, r, m, i : Integer;
f : boolean;
Begin
Sort (pole, 1, n);
Print (A, n);
l:=1;r:=n;
cnt:=0;
f:=false;
While (l<=r) and (not f) do
Begin
m:=(l+r) div 2;
If A [m, pole]=strFind Then
Begin
f:=true;
i:=0;
While A [m+i, pole]=strFind do {Цикл предусматривает запись в новый массив нескольких строк, удовлетворяющих условию}
Begin
Inc (cnt);
B [cnt]:=A [m+i];
Inc (i);
End;
i:=1;
While A [m i ,pole]=strFind do
Begin
Inc (cnt);
B [cnt]:=A [m i];
Inc (i);
End;
End
Else If A [m, pole] Else r:=m 1;
End;
End;
{Основная программа идентична предыдущей версии программы}
Результат работы этой программы аналогичен предыдущему. Однако интерес представляет оценка временной сложности данного алгоритма. Здесь применялись два метода: сортировка и поиск, каждый из которых имеет временную сложность порядка О(log2n), значит, время работы всей программы не превышает 2*О(log2n), что, безусловно, меньше, чем n2. Таким образом, известными методами удалось снизить временную сложность алгоритма. Такого рода экспериментальная работа с программами призвана повысить интерес школьников и положительно повлиять на развитие их интеллектуальных качеств.
Кроме того, если данные представлены в виде двумерного массива строкового типа, то при решении заданий под буквами б) или в) возникают новые задачи: нахождение подстроки в строке, перевод строки (с датой) в число и т. д., что еще раз послужит закреплению соответствующих навыков.
Задачи сами по себе не сложные, однако, на их примере ученики на самом деле изучают не что иное, как операцию выборки записей из реляционной таблицы. После рассмотрения нескольких таких примеров можно предложить учащимся создать универсальную программу для всех трех задач (для этого проверку условия для строк исходного массива можно оформить в виде функции, а формирование нового массива – в виде соответствующей процедуры под названием «Выборка»).
Аналогичным образом формулируются задачи по изучению остальных операций реляционной алгебры. Например, операцию проекции будут имитировать задания следующего типа.
2. В условиях задачи 1 а) сформировать массив данных об абитуриентах, включающих только фамилию, имя и отчество учеников; б) вывести список школ, выпускники которых поступали в прошлом году на факультет информатики и т. д.
3. Для реализации операций объединения, пересечения и разности нужно будет рассмотреть еще один массив с аналогичными данными, например, об абитуриентах, поступавших на специальность «Прикладная информатика в экономике». И решить задачи по формированию нового массива, содержащего а) обобщенную информацию обо всех абитуриентах, поступавших на специальность «Информатика и английский язык» или «Прикладная информатика в экономике»; б) информацию об абитуриентах, поступавших одновременно на две вышеупомянутые специальности; в) информацию об абитуриентах, поступавших только на специальность «Информатика и английский язык».
Центральным моментом каждой из трех программ является проверка наличия одинаковых строк в исходных массивах. При решении этой задачи «в лоб» каждая строка одного массива сравнивается с каждой строкой другого массива. В результате программа получается достаточно простой. Однако здесь снова актуальны проблемы временной сложности алгоритмов и модификации программ. Кроме того, при решении второй задачи нужно учесть возможность получения пустого массива, а при нахождении разности (третья задача) ученики должны обратить внимание на несимметричность этой операции (разность массивов А и В и разность массивов В и А в общем случае различны).
4. Операцию декартова произведения будет имитировать следующая задача. Наряду с массивом абитуриентов рассматривается еще один массив «Экзамены», содержащий информацию об экзаменах, которые необходимо сдать для поступления на определенную специальность факультета информатики: № предмета, название предмета (например, русский язык, информатика, английский язык). Необходимо вывести массив, содержащий все столбцы исходных массивов, то есть «связать» каждого абитуриента с каждым предметом. В результате решения этой задачи получается, если так можно выразиться, незаполненная ведомость по абитуриентам и экзаменам.
5. Для заполнения этой ведомости конкретными оценками абитуриентов нужно соединить полученный массив с массивом «Оценки», содержащим информацию об экзаменационных оценках по определенному предмету (например, по информатике) со столбцами: № личного дела, оценка. Соединение таблиц производится по общему столбцу № личного дела. Таким образом, можно получить экзаменационную ведомость по предмету информатике всех абитуриентов, поступавших на специальность «Информатика и английский язык».
Список задач может быть продолжен, важно, чтобы при их решении у учащихся сформировались вполне определенные представления о сути рассмотренных операций и способах их реализации. После рассмотрения достаточно широкого круга подобных задач в распоряжении учеников будет совокупность универсальных процедур, каждая из которых реализует ту ил иную реляционную операцию. Затем мы можем переходить к организации запросов по условно созданной базе данных, формулируемых также в виде определенных задач. Например:
6. Вывести № личного дела, фамилии и имена абитуриентов, сдавших экзамен по информатике на 4 или 5.
После тщательного анализа этой задачи учащиеся, наверняка, заметят, что для ее решения можно использовать ранее рассмотренные операции, а именно: сначала соединить массивы «Абитуриент» и «Оценки по информатике», затем на объединенном массиве сделать выборку по оценкам 4 или 5, а потом сделать проекцию получившегося массива на столбцы № личного дела, фамилия, имя, предмет, оценка. Таким образом, любой запрос можно будет свести к применению конечного набора рассмотренных операций реляционной алгебры.
Но здесь также возникают проблемы оптимизации алгоритмов. В частности, возникает вопрос, применение какой последовательности операций даст наиболее эффективный (по времени) алгоритм? Ведь получить желаемый в предыдущей задаче результат можно и другим путем: сначала сделать выборку в таблице оценок (выбрать только записи с оценками 4 или 5), а уже потом производить соединение и проекцию. Подобные вопросы также дают почву ученикам для размышления и применения своих знаний на практике.
Построенная таким образом серия задач позволяет:
• применять обобщения в текущей учебной работе на каждом уроке;
• устанавливать больше логических связей в материале;
• выделять главное и существенное в большой дозе материала;
• выявить больше межпредметных связей и приложений изучаемых понятий и алгоритмов;
• более эмоционально подать материал;
• сделать более эффективным закрепление материала.
Каждая задача представляет собой некоторую проблему, решение которой опирается на решенные ранее задачи. Рассмотрение взаимосвязанных объектов в системе, как единое целое, способствует обучению не отдельным мыслительным операциям в случайном, стихийно складывающемся порядке, а системе умственных действий для решения нестереотипных задач. Ученик, анализируя, сравнивая, синтезируя, обобщая, конкретизируя фактический материал, сам способен получить из него новую информацию.
По нашему предположению, предлагаемая организация изучения СУБД, при которой освоение фундаментальных понятий происходит за счет специально разработанной системы задач, будет способствовать более эффективному овладению учащимися основными навыками работы в базах данных. Методически обоснованный отбор заданий по обработке массивов данных позволяет наряду с отработкой навыков программирования рассматривать основные понятия баз данных. При таком обучении деятельность учащихся становится активной, меняется роль ученика: из пользователя он превращается в активного исследователя, думающего, планирующего, ищущего. По мере решения задач, сводящихся к программной реализации работы той или иной операции, у ученика появится не только четкое представление о сути этой операции (что она делает), но и осознание того, как она работает, а значит, в дальнейшем при работе с конкретными программами СУБД (например, Microsoft Access) ученик будет понимать, «что стоит за щелчком мыши» и не будет зависеть от конкретной программы.
Примечания
1. Рубинштейн, С. Л. Принципы творческой самодеятельности [Текст] / С. Л. Рубинштейн // Вопросы психологии. 1986. № 4; Ракитина, Е. А. Построение методической системы обучения информатики на деятельностной основе [Текст]: автореф. дис. ... д ра пед. наук / Е. А. Ракитина. М., 2002.
2. Балл, Г. А. Теория учебных задач [Текст] / Г. А. Балл. М.: Педагогика, 1990. 184 с.; Рыжова, Н. И. Развитие методической системы фундаментальной подготовки будущих учителей информатики в предметной области [Текст]: дисс. … д ра пед. наук / Н. И. Рыжова. СПб., 2000.
3. Концепция профильного обучения на старшей ступени общего образования [Текст] // Информатика и образование. 2003. № 6. С. 3 13.
4. Дейт, К. Дж. Введение в системы баз данных [Текст]: пер. с англ. / К. Дж. Дейт. 6 е изд. Киев: Диалектика, 1998. С. 57.
5. Окулов, С. М. Основы программирования [Текст]: учебное пособие / С. М. Окулов. М.: ЮНИМЕДИАСТАЙЛ, 2002. 424 с.