Главная страница
Навигация по странице:

  • 3.1. ПРОЕКТИРОВАНИЕ СХЕМЫ ХРАНИЛИЩА

  • 3.3. ПОИСК ИНФОРМАЦИИ В ХРАНИЛИЩЕ

  • 3.4. ПОСТРОЕНИЕ ОТЧЕТОВ С ПОМОЩЬЮ ЗАПРОСОВ К ХРАНИЛИЩУ

  • Андрианова

  • ку. УП 07. Практикум по курсу технологии баз данных Учебное пособие


    Скачать 2.49 Mb.
    НазваниеПрактикум по курсу технологии баз данных Учебное пособие
    Дата08.12.2022
    Размер2.49 Mb.
    Формат файлаpdf
    Имя файлаУП 07.pdf
    ТипПрактикум
    #834304
    страница4 из 4
    1   2   3   4



    font-weight:bold; text-align: none;color: #0000FF;">
    Список зачетов и экзаменов.
















    80
    // создание специального объекта- xslt-преобразователя
    XslCompiledTransform xslt = new XslCompiledTransform();
    // загрузка файла с xslt-преобразованием xslt.Load("../../forreport.xslt");
    // выполнение преобразования и генерация на основе xml-файла
    //html-файла представления данных xslt.Transform("forreport.xml", "D:\\forreport.html");
    // загрузка полученного html_файла в элемент управления WebBrowser webBrowser1.Navigate("D:\\forreport.html");

    81
    ЧАСТЬ III. ВВЕДЕНИЕ В ХРАНИЛИЩА ДАННЫХ
    Хранилища данных – это специальным образом сконструированные базы данных, которые предназначены не столько для хранения информации, сколько для быстрого получения сложных аналитических данных. Перечислим основ- ные характерные моменты, связанные с проектированием и эксплуатацией хра- нилищ данных, построенных на реляционной модели:
    1.
    Хранилища данных строятся на особой модели базы данных, кото- рая пренебрегает многими аспектами нормализации. В основном, используются схемы типа «Снежинка» и «Звезда». В обеих схемах выделяется центральная
    таблица фактов, которая и содержит данные для анализа, и множество таблиц
    измерений (обычно сильно ненормализованных), содержащие информацию об объектах, в разрезе которых осуществляется анализ, и которые соединены с таблицей фактов связью типа «один-ко-многим».
    2.
    Хранилища не предназначены для большого количества операций модификации данных. Обычно в хранилищах дублируются данные из операци- онных баз данных (базы, в которые попадают первичные данные). Зато они су- щественно зависят от операций экспорта из различных источников (не обяза- тельно из баз данных).
    3.
    Большая часть запросов к хранилищу данных связана с таблицей фактов, соединенной только с теми измерениями, которые необходимы для це- лей анализа.
    В качестве учебного примера рассмотрим особенности проектирования и использования хранилища для примера базы с данными об учебном процессе.
    Для определенности будем использовать в качестве СУБД MS SQL Server. Рас- смотрим основные этапы проектирования и использования хранилищ данных.

    82
    3.1. ПРОЕКТИРОВАНИЕ СХЕМЫ ХРАНИЛИЩА
    Рассмотрим схему «Звезда». В качестве таблицы фактов будем использо- вать таблицу результатов сдачи экзаменов студентами. В качестве таблиц изме- рений будут фигурировать таблицы «Студенты», «Преподаватели», «Дисци- плины».
    Итак, у нас получилась довольно простая модель данных с тремя табли- цами измерений. Отметим денормализацию на уровне таблицы измерений
    «Преподаватели» (в нее включается название кафедры, а не ее номер, как это было ранее). Кроме того, отметим наличие еще одного измерения, для которого таблица не создается. Этим измерением является дата сдачи экзамена. Фактами же в данном случае являются набранные баллы и соответствующая им оценка.
    Рис. 49. Схема «Звезда» для хранилища данных.

    83
    3.2.
    ЗАГРУЗКА ДАННЫХ
    Произведем загрузку данных из базы данных через файлы различного текстового формата.
    Начнем с загрузки данных в таблицы измерений.
    Таблица «Students». Таблица студентов должна быть загружена в том же виде, что и хранится в базе данных деканата. Используем для загрузки файл формата CSV. Этот формат определяет текстовый файл, в котором в первой строке задаются имена столбцов, а каждая следующая строка содержит данные об одной записи, поля разделяются с помощью специального символа- разделителя.
    Чтобы создать такой файл оболочка dbForge Studio содержит специаль- ный конструктор экспорта данных. Доступ к нему можно получить, например, с помощью вкладки «Миграция данных» и опции «Экспорт данных». При экс- порте придется указать источник данных для экспорта (таблицы или представ- ления) и файл, в который произойдет сохранение информации. В результате будет получен следующий файл:
    Рис. 50. Файл «Student.csv».
    При импорте данных в базу хранилища данных следует воспользоваться той же вкладкой «Миграция данных» и опцией «Импортировать внешние дан- ные». Сначала потребуется выбрать формат и файл с данными, затем опреде- лить таблицу, в которую осуществляется импорт, далее будет показан источник данных и можно будет сделать необходимые настройки (пропустить строки,

    84 установить символы-разделители), далее устанавливается соответствие между столбцами источника и приемника данных (в нашем случае они называются одинаково) и далее следуют уточнения по поводу операций импорта (какие операции произвести – добавление новых записей, модификация старых), ин- терпретация типов данных и прочее.
    Таблица «Subjects». Таблица дисциплин также должна быть загружена в том же виде. Используем для ее загрузки файл формата XML. Этот формат определяет текстовый файл, в котором структура и данные размечены с помо- щью специальных тегов. Как и в предыдущем случае следует использовать оп- ции «Экспорт данных» и «Импортировать внешние данные». В результате бу- дет сгенерирован следующий файл:























    "Объектно-ориентированное программирование" />




    85
    Таблица «Teachers». При экспорте таблицы преподавателей мы должны на самом деле экспортировать результат его естественного соединения с табли- цей кафедр. Для этого придется создать специальное представление данных, так как запрос не может быть использован в качестве источника данных для экспорта.
    CREATE VIEW Teacher_for_export
    AS
    SELECT idTeacher, FIOTeacher, TitleDepartment FROM Teachers
    INNER JOIN Departments
    ON Teachers.idDepartment=Departments.idDepartment;
    Используем для загрузки данных о преподавателях файл формата Excel, указав при экспорте в качестве источника данных созданное представление.
    При импорте этих данных следует обратить внимание на настройки относи- тельно строки с заголовками столбцов – требуется явно указать, что первая строка является строкой с именами столбцов, тогда данные будут считываться только со следующей строки. Не забудьте при импорте настроить соответствие для имен столбцов с названием кафедры
    Рис.51. XLS-файл с данными о преподавателях.
    Отметим, что экспортировать данные можно и в другие форматы: RTF,
    PDF и т.д., но для импорта в другую базу эти форматы не будут пригодными.
    Вполне естественно, что файл для импорта не обязательно должен быть сгенерирован каким-либо СУБД. Так как таблицу результатов сдачи зачетов- экзаменов в базе данных мы практически не заполняли, экспортировать в таб- лицу фактов нам пока нечего.

    86
    Напишем приложение, которое генерирует файл с оценками, и далее им- портируем его в нашу базу данных. Для простоты не будет рассматривать ситу- ацию, когда разные группы должны сдавать разный набор дисциплин. Будем предполагать, что у каждого студента имеются оценки по всем дисциплинам, которые есть в таблице измерений.
    Программный код такого проекта по генерации данных будет следую- щим. Комментариев в коде должно быть достаточно для понимания алгоритма генерации: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.Odbc; using System.IO; namespace generator
    { class Program
    {
    // в набор данных будут загружены измерения
    // для правильной генерации кодов объектов static DataSet ds = new DataSet();
    // вспомогательная функция перевода баллов в оценку static int GetMark(int b)
    { if (b < 55) return 2; if (b < 71) return 3; if (b < 86) return 4; return 5;
    } static void Main(string[] args)
    {
    OdbcConnection con = new OdbcConnection("DSN=proba"); con.Open();
    // загрузка таблицы студентов
    OdbcDataAdapter adapt1 = new OdbcDataAdapter("select * from Students", con); adapt1.Fill(ds, "Students");
    // загрузка таблицы дисциплин
    OdbcDataAdapter adapt2 = new OdbcDataAdapter("select * from Subjects", con); adapt2.Fill(ds, "Subjects");

    87
    // загрузка таблицы преподавателей
    OdbcDataAdapter adapt3 = new OdbcDataAdapter("select * from Teachers", con); adapt3.Fill(ds, "Teachers"); con.Close();
    //создание текстового файла для записи
    //сгенерированных данных
    StreamWriter tf = new StreamWriter
    (new FileStream("Results.csv", FileMode.Create));
    // запись строки заголовка таблицы.
    // Для вывода кавычек используется \” tf.WriteLine("\"idStudent\";\"idSubject\";
    \"idTeacher\";\"DateExam\";
    \Balls\";\"Mark\"");
    // вызов функции генерации данных
    GenerateData(tf);
    // закрытие файла tf.Close();
    }
    // функция генерации оценок экзаменов по всем дисциплинам static void GenerateData(StreamWriter tf)
    {
    Random r = new Random();
    // цикл перебора всех дисциплин foreach (DataRow dr_subj in ds.Tables["Subjects"].Rows)
    {
    // генерируем преподавателя,
    // которому сдается данный предмет int i = r.Next(ds.Tables["Teachers"].Rows.Count); int nom_teach =
    (int)ds.Tables["Teachers"].Rows[i]["idTeacher"];
    //генерируем три даты для сдачи экзамена
    DateTime [] dates=new DateTime[3];
    //определяем зимнюю или весенюю сессии if (r.Next(100) % 2 == 0)
    {
    // зимняя сессия dates[0] = new DateTime(2014, 1, 5 + r.Next(20)); dates[1] = new DateTime(2014, 1, 5 + r.Next(20)); dates[2] = new DateTime(2014, 1, 5 + r.Next(20));
    } else
    {
    // весенняя сессия dates[0] =

    88 new DateTime(2014, 6, 3 + r.Next(24)); dates[1] = new DateTime(2014, 6, 3 + r.Next(24)); dates[2] = new DateTime(2014, 6, 3 + r.Next(24));
    }
    // цикл перебора всех студентов foreach (DataRow dr_stud in ds.Tables["Students"].Rows)
    {
    // генерируем оценку - будем оптимистами,
    // все оценки положительные int balls = 55 + r.Next(45); int mark = GetMark(balls);
    // генерируем дату сдачи экзамена int nom_date = r.Next(120) % 3;
    // формируем строку вывода сгенерированной
    // информации tf.WriteLine("{0};{1};{2};{3};{4};{5}", dr_stud["idStudent"], dr_subj["idSubject"], nom_teach, dates[nom_date], balls, mark);
    }
    }
    }
    }
    }
    Таким образом, получим следующий csv-файл, который импортируем в базу данных для организации хранилища:
    Рис. 52.CSV-файл с оценками студентов.

    89
    3.3. ПОИСК ИНФОРМАЦИИ В ХРАНИЛИЩЕ
    По своей сути таблица фактов представляет собой OLAP-куб (Online
    Analytical Processing), который позволяет быстро находить интересующую ин- формацию в разных аспектах. Существуют стандартные операции с OLAP- кубами: срез, вращение, консолидация и детализация. Кратко опишем суть этих операций:

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

    Операция вращения предполагает переупорядочивание измерений.

    Операция консолидации предполагает выполнение агрегирования данных по отдельным измерениям.

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

    Получить все оценки по дисциплине «Математический анализ». В этом случае мы используем операцию среза. Можно сказать, что это одновре- менно является срезом по измерению «Преподаватель» (так как согласно генерации данных дисциплина ведется только одним преподавателем):
    SELECT FIOStudent, Mark FROM Results INNER JOIN Students
    ON Results.idStudent=Students.idStudent
    WHERE idSubject =
    (SELECT idSubject FROM Subjects
    WHERE TitleSubject='Математический анализ');
    Результатом является другой гиперкуб, в данном случае с одним измере- нием FIOStudent и фактом - оценкой.

    90
    Рис. 53. Оценки студентов по дисциплине «Математический анализ».

    Получить средние баллы всех студентов. Здесь демонстрируется опера- ция консолидации, которая выражается укрупнением группировок по из- мерениям.
    SELECT FIOStudent, AVG(Balls) AS "Средний балл" FROM
    Results INNER JOIN Students
    ON Results.idStudent=Students.idStudent
    GROUP BY FIOStudent;
    Рис. 54. Средние баллы студентов.

    Получить средние баллы сдачи экзаменов по группам студентов. В дан- ном случае производится консолидация по более крупной группе – номе- рам групп студентов. Таким образом, результатом является гиперкуб, в котором два измерения – дисциплина и номер учебной группы. В каком- то смысле здесь производится переупорядочивание измерений, поэтому можно говорить и о применении операции вращения.
    SELECT TitleSubject, NumGroup, AVG(Balls) AS "Средний балл" FROM
    Results INNER JOIN Subjects
    ON Results.idSubject=Subjects.idSubject
    INNER JOIN Students ON Results.idStudent=Students.idStudent
    GROUP BY TitleSubject, NumGroup ORDER BY TitleSubject;

    91
    Рис. 55. Средние баллы по предметам и группам.

    Получить средние баллы по преподавателям. Какому студенту не хоте- лось знать перед экзаменом, какой преподаватель более лояльный? Ситу- ация аналогичная запросу о средних баллах студентов. Как видно, нашел- ся один заметно более строгий преподаватель.
    SELECT FIOTeacher, AVG(Balls) AS "Средний балл" FROM
    Results INNER JOIN Teachers
    ON Results.idTeacher=Teachers.idTeacher
    GROUP BY FIOTeacher;
    Рис. 56. Средние баллы по преподавателям.

    Получить количество пятерок, которые поставили преподаватели.
    SELECT FIOTeacher, COUNT(Mark) AS "Количество пятерок" FROM
    Results INNER JOIN Teachers
    ON Results.idTeacher=Teachers.idTeacher
    WHERE Mark=5
    GROUP BY FIOTeacher;
    Рис. 57. Количество пятерок, которые поставили преподаватели.

    92

    Узнать, в какую сессию (зимнюю или летнюю) студенты сдают экзамены лучше. Для этого мы рассчитаем средние баллы сдачи экзаменов зимой и летом. Здесь мы опять сталкиваемся с операцией консолидации, но по не- стандартному измерению – дате сдачи экзамена.
    SELECT DATEPART(month,DateExam) AS "Месяц",
    AVG(Balls) AS "Средний балл"
    FROM Results GROUP BY DATEPART(month,DateExam);
    Рис. 58. Средние баллы в зимнюю и летнюю сессии.

    Получить количество дисциплин, которые ведет каждый из преподавате- лей. Здесь в качестве факта выступает измерение таблицы фактов idSub- ject. В данном случае сначала применяем операцию детализации, выбирая для нового гиперкуба из таблицы фактов только некоторые данные, после чего применяется операция консолидации посредством группировки по измерению «Преподаватель».
    SELECT FIOTeacher, COUNT(idSubject) AS "Количество дисциплин" FROM
    (SELECT DISTINCT FIOTeacher, idSubject FROM Results
    INNER JOIN Teachers
    ON Results.idTeacher=Teachers.idTeacher) AS Q1
    GROUP BY Q1.FIOTeacher;
    Рис. 59. Количество дисциплин каждого из преподавателей.

    Получить количество студентов, сдавших дисциплину «Математический анализ» на каждую дату сдачи этого предмета. Здесь используется опера-

    93 ция среза, после чего применяется операция консолидации по дате сдачи экзамена.
    SELECT DateExam, COUNT(*) AS "Количество студентов" FROM Results
    WHERE idSubject=(SELECT idSubject FROM Subjects WHERE
    TitleSubject='Математический анализ')
    GROUP BY DateExam;
    Рис. 60. Количество студентов, сдавших математический анализ на разные даты.

    Получить количество дат, в которые проводились экзамены по каждому из предметов. Данный запрос будет связан с последовательностью опера- ции детализации и консолидации.
    SELECT TitleSubject, COUNT(DateExam) AS "Количество дат" FROM
    (SELECT DISTINCT TitleSubject, DateExam FROM Results
    INNER JOIN Subjects
    ON Results.idSubject=Subjects.idSubject) AS Q1
    GROUP BY Q1.TitleSubject;
    Рис. 61. Количество дат сдачи каждого из экзаменов.

    Получить количество оценок каждого типа по дисциплине «Математиче- ский анализ». В данном примере применение среза и последующей дета- лизации приведет к построению гиперкуба, в котором можно сделать факт (оценку) измерением. Затем к этому новому гиперкубу применяется операция консолидации.

    94
    SELECT Mark, COUNT(*) AS "Количество" FROM Results
    WHERE idSubject =
    (SELECT idSubject FROM Subjects
    WHERE TitleSubject='Математический анализ')
    GROUP BY Mark;
    Рис. 62. Количество оценок каждого типа по математическому анализу.

    95
    3.4. ПОСТРОЕНИЕ ОТЧЕТОВ С ПОМОЩЬЮ ЗАПРОСОВ К
    ХРАНИЛИЩУ
    Оболочка dbForge Studio содержит собственные средства для создания отчетов. Отчеты формируются в виде файлов с расширением rbd. Они содержат разметку элементов данных в отчете. Файл можно создать с помощью кон- структора, который вызывается с помощью вкладки «Анализ данных» старто- вой страницы и пункта «Дизайн нового отчета».
    На первой странице дизайнера (мастера) предлагается выбрать базу дан- ных и источник данных (таблицу или запрос). На следующей странице можно будет выбрать таблицу или написать текст запроса для отображения в отчете.
    Далее можно будет выбрать поля для отображения в отчете. На следующем ша- ге задаются принципы группировки записей (группировок может быть несколь- ко и они могут образовывать иерархию). Далее следуют несколько шагов с за- данием характеристик внешнего вида отчета.
    Например, на основании запроса, представляющего собой соединение таблицы фактов и всех таблиц измерений, сгенерируем отчет:
    Рис. 63. Вид отчета.

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

    97
    СПИСОК ЛИТЕРАТУРЫ
    1. Бейли, Л. Изучаем SQL [Текст]: пер.с англ./ Линн Бейли – СПб: ИД
    «Питер», 2012. – 592 с.
    2. Кренке, Д. Теория и практика построения баз данных [Текст]: пер.с англ. / Дэвид Кренке. – СПб: Питер, 2003. – 800 с.
    3. Ульман., Д. Основы реляционных баз данных [Текст]: пер.с англ. /
    Джеффри Д.Ульман, Дженифер Уидом. – М: Вильямс, 2006. – 382 с.
    4. Лобел, Л. Разработка приложений на основе Microsoft SQL Server 2008
    [Текст]: пер с англ./ Л. Лобел, Э.Дж. Браст, С. Форте. – СПб.:БХВ-
    Петербург, 2010. – 1024 с.
    5. Кузнецов, М. MySQL 5 в подлиннике [Текст] / Максим Кузнецов,
    Игорь Симдянов. – СПб: БХВ-Петербург, 2010. – 1007 с.
    6. Уорсли, Д. PostgreSQL [Текст]: пер.с англ. /Дж.Уорсли, Дж.Дрейк. –
    СПб: Питер, 2003. – 496 с.
    7. Пинягина, О.В. Практикум по курсу "Базы данных" [Текст]/
    О.В.Пинягина, И.А.Фукин. – Казань, Казанский федеральный универ- ситет, 2012. – 92 c.
    8. Пирогов, В.Ю. Информационные системы и базы данных: организация и проектирование [Текст]/ В.Ю.Пирогов. – СПб: БХВ-Петербург, 2009.
    – 528 с.
    9. Советов, Б.Я. Базы данных: теория и практика: Учебник для бакалавров
    [Текст]/ Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. – М.:
    Юрайт, 2013. – 463 c.

    98
    Учебное пособие
    Андрианова Анастасия Александровна
    Мухтарова Татьяна Маратовна
    Рубцова Рамиля Гакилевна
    ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО КУРСУ
    «ТЕХНОЛОГИИ БАЗ ДАННЫХ»
    Дизайн обложки
    Р.Г.Рубцова
    Подписано в печать _10.03.2016.
    Бумага офсетная. Печать цифровая.
    Формат 60х84 1/16. Гарнитура «Times New Roman». Усл. печ. л. .
    Тираж экз. Заказ
    Отпечатано с готового оригинал-макета в типографии Издательства Казанского университета
    420008, г. Казань, ул. Профессора Нужина, 1/37 тел. (843) 233-73-59, 233-73-28
    1   2   3   4


    написать администратору сайта