Ко мне как к студенту первокурснику Университета Иннополис часто обращаются с вопросом, чем же мы тут занимаемся. Специально для хабра я написал сказ о том, как мы проект по DMD «пилили».
Внимание! Автор не гарантирует, что его шутки будут понятны и смешны.
Есть у нас в Университете такой базовый (core)-курс, который преподается абсолютно всем — Data Modelling and Databases (DMD). Как понятно из названия, в этом курсе нам преподают базы данных: что это такое, для чего это нужно, как этим пользоваться и что бывает еще.
В основном идет работа с СУБД PostgreSQL, то есть мы работаем с реляционной базой данных. Мне, как новичку, эта тема очень интересна, так как база данных – это «хранилище» информации. Ну а кто владеет информацией, тот владеет миром. Преподавательский состав этого курса выглядит так:
- Primary Instructor – Qiang Qu (Китай),
- Secondary Instructor – Sadegh Nobari (Иран),
- Assistant Instructor – Jooyoung Lee (Южная Корея) и Waqas Nawaz (Пакистан),
- Teaching Assistant – Marat Valiev (Россия).
В основном все лекции проводятся Qiang Qu, но иногда лекция разделяется на две части, где к нему присоединяется Sadegh Nobari. У первокурсников семинары проводит Марат Валиев. Также стоит отметить, что лекции проходят на английском языке (даже не смотря на чуть заметный акцент преподавателей, все воспринимается легко и понятно).
В один из солнечных сентябрьских дней инструкторы сообщили нам радостную новость: «Ребята, по нашему курсу вы должны разработать систему управления публикациями (статьями). Это будет Вашим проектом, который оценивается в 15% от вашего итогового результата по предмету». Весь проект поделен на пять частей:
- Разработать и реализовать реляционную модель при помощи существующих СУБД.
- Разработать веб-интерфейс для взаимодействия с созданной в фазе 1 базой данных.
- Разработать свою СУБД и связать ее с использованной в первой фазе
- Разработать веб-приложение, которое в режиме реального времени показывает занятую память, нагрузку CPU и disk I/O.
- Креативная идея
Чтобы начать работу над проектом, необходимо поделиться на команды из своей группы. Требование: в команде не более трех человек. В итоге вышло так, что и один человек оказался серьезной командой.
Итак, мне посчастливилось работать втроем и нас объединяло то, что никто из нас не делал подобных вещей. Надо, так надо (курс-то заваливать не хочется, да и интересно все же). Первокурсникам была поставлена задача: выполнить только две фазы.
Для первой фазы было необходимо: создать ER-model и Relational model нашей будущей базы, нормализовать таблицы, найти сайт с научными статьями и выкачать данные по этим статьям в нашу базу (не менее миллиона статей), написать SQL-запросы для ранжирования этих статей и запросы для поиска похожих статей. Поехали!
Для начала создали ER-model нашей базы (скажу сразу, что хорошая модель вышла где-то после трех-четырех переделываний). Далее преобразовали все это в relational model и нормализовали по BCNF. Вышло все просто замечательно. После долгих и мучительных попыток написания парсера на PHP, было принято решение начать гуглить. В результате был найден граббер на питоне, который выкачивает информацию по статьям с сайта и переводит все это в XML-файлы. В итоге мы получили 1074 XML-файла, где в каждом находится по 1000 записей о статьях. Сайт, с которого все выкачивалось, — arxiv.org. Теперь нам нужно пропарсить все эти файлы в нашу базу. Для обработки XML-файла был использован DOM-parser в Java.В ней же мы подключались к нашей базе данных и отправляли данные при помощи JDBC Driver, любезно предоставленной PostgreSQL. На выходе мы получили базу с 1074000 записями. Wow! Половина фазы завершена. Пришло время запросов, но о них будет написано позже.
Наступило время второй фазы. Команда поделилась на back-end и front-end. Для фронта использовались HTML, CSS и JavaScript. Первым этапом было создание регистрационной формы и подключение к ней базы данных для создания новых пользователей и проверки корректности введенных данных уже зарегистрированными пользователями. Никакой e-mail рассылки, просто всплывающее окошко об успешной регистрации. Для формы регистрации использовались готовые шаблоны на JavaScript и PHP для коннекта с базой. Дальше шло создание основных страниц нашего сайта. Изначально предполагалось 5 страниц, в итоге было создано три – Home, Add (добавление новой статьи) и Search (для поиска статей в базе). На двух последних страницах использовались простые формы поиска и добавления, разбавленные CSS для красивостей. На главной же странице присутствуют две диаграммы, отображающие количество статей с 1996 по 2015 годы и количество статей по 6 основным категориям. Для этого использовались готовые шаблоны на JavaScript и PHP для select’a из базы необходимых данных. На этом front-end завершает свою деятельность и передает себя в руки back’a.
Back поделен на 4 этапа. На первом этапе писались запросы для поиска. Поиск производится по ключевому слову, категории, дате публикации или по различной комбинации вышеперечисленных способов. Поиск по ключевому слову – это поиск по названию, краткому содержанию и категории. Результаты выдаются по релевантности – на первом месте совпадение по названию, на последнем – по категории. Для быстрого получения поиска был реализован полнотекстовой поиск и индекс GIN с типом tsvector. GIN был выбран потому, что производит быстрый и эффективный поиск по базе.
На втором этапе были написаны методы сортировки. По умолчанию установлена сортировка по релевантности (при помощи алгоритма Левенштейна). Также возможна сортировка по дате (пользователь может выбрать этот тип). Третий этап – запросы на добавление статей. Реализованы при помощи простых INSERT’ов. Вроде бы все просто, но нужно было предусмотреть одну вещь – защиту от SQL-инъекций. Для этого была использована PHP функция pg_escape_string для введенных данных. Этот же метод был реализован при создании регистрационной формы. Последний этап — обновление и удаление статей. Опять же использованы стандартные запросы SQL и предусмотрена защита от инъекций.
На этом две фазы, ну и наш проект, завершены.
На этом повествование о первом опыте в создании проектов подошло к концу. Надеюсь, что я удовлетворил любопытство многих, а у нас в будущем будут проекты покруче, повеселее и помасштабнее.
Добрых вам дней/ ночей и успехов в учебе/работе! Поступайте в Университет, конкурс на гранты на следующий учебный год уже открыт на apply.innopolis.ru 🙂
Марсель Гусманов, студент 1 курса бакалавриата
Общежития
Спорткомплекс
ссылка на оригинал статьи http://habrahabr.ru/post/272235/
Добавить комментарий