14 декабря 2015

Схемы БД ко второй контрольной

На второй контрольной надо будет писать запросы разной степени сложности. Сами запросы вы увидите во время контрольной, а схемы БД можно поизучать уже сейчас.

Вариант 21 "Пироги" (почти те самые, но с некоторыми изменениями)
Вариант 23 "Банк"



01 декабря 2015

Схема БД для контеста

Контест посвящен космическим путешествиям!

Схема БД тут.
А тут SQL-скрипт, генерирующий данные.

 А  тут запросы

Оба скрипта доступны в SQooL в виде шаблона "Контест 2 декабря"

Напомню правила:

  • Баллы можно получить за авторство запросов и за решение
  • Автор запроса должен написать запрос в человекочитаемом текстовом виде, дать ему оценку по шкале "простой" - "средний" - "сложный" - "никто не решит!", написать свое каноническое решение и прислать мне по почте. 
    • У нас не будет много времени на уточнение решения, поэтому постарайтесь делать канонические решения правильными. 
    • Каноническое решение должно давать детерминированный ответ. Лучше всего делать ответ упорядоченным и оговаривать условие сортировки в тексте
  • В процессе решения на паре вы выбираете запросы из имеющихся, решаете и присылаете мне ответы. Постараюсь проверять в реальном времени. За правильное решение запроса со стоимостью P каждый из N решивших получает P/(N+1) баллов. Автор получает тоже P/(N+1) балл, при условии что запрос вообще хоть кто-то решал (была хоть одна попытка).
Пример запроса:

Найти всех пилотов, водивших корабли на планеты с диктатурой. В ответе должны быть имена пилотов, отсортированные по возрастанию.
Простой.
Решение: 

SELECT DISTINCT C.name FROM Commander C JOIN Flight F ON(C.id = F.commander_id) JOIN Planet P ON (F.planet_id = P.id) JOIN Government G ON (G.id = P.government_id)
WHERE G.value = 'диктатура'

ORDER BY name;

25 ноября 2015

Тренировочный контест

Схема и данные


Запросы

  • Работник-чемпион по количеству интервью 
  • У кандидатов с вердиктами 'soft accept' и 'strong accept' найти MAX и MIN средние баллы за интервью и выветси данные о соответствующих кандидатах
  • Найти кандидатов, подавшихся на >1 вакансию
  • Найти противоречия в данных, например:
    • несовпадения дат
    • проигнорированный флажок фильтрации
    • принятые ('* accept') кандидаты с низким баллом (например < 2.0)

23 октября 2015

Практика 21 октября. Исходники и ДЗ

Исходники, использованные на практике 21 октября

Домашнее задание

Мы хотим организовать ключевые слова, характеризующие содержание статьи или интересы ученого, в деревянную иерархию. Примером такой иерархии может служить ACM Computing Classification System [1]
Иерархия представляет из себя лес, где корнями являются очень широкие темы, а каждый последующий уровень постепенно тему сужает.
Статья может быть связана с любыми элементами этой классификации, на любом уровне.
Нужно придумать схему хранения этой классификации в БД и связи статей с темами и написать запросы:
  • добавляющий новую тему с указанной родительской темой (приветствуется оформление в виде хранимой процедуры)
  • показывающий всё поддерево тем, начиная с заданной. Результат должен быть удобен для обработки приложением, чтобы ему не нужно было прикладывать чрезмерных усилий, чтобы напечатать дерево. Добавлять в метки пробелы-отступы, однако, не нужно.
  • выдающий все статьи, проассоциированные с темами из поддерева с заданным корнем
  • находящий ближайшего общего предка для двух заданных тем
Запросы приведены в порядке возрастания сложности (как мне кажется), так что начните с самых простых


16 октября 2015

Домашнее задание №4

Описание

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

Схема и данные

В приложенном архиве находятся файл со схемой БД и скрипт на Питоне, заполняющий таблицы данными
psql -h localhost -U postgres < 01_gen_schema.sql
python 02_gen_data.py

Схема БД

В базе данных есть таблицы Conference, Paper, Keyword и связи многие-ко-многим PaperConference и PaperKeyword. Смысл таблиц и их атрибутов, полагаю, ясен из их названий.

Задание

В результате должно получиться представление со схемой:
conference TEXT, keyword TEXT, count INT
Запись в представлении означает, что в статьях, поданных на конференцию conference ключевое слово keyword упоминается countраз. В представление должны попасть для каждой конференции ключевые слова с наибольшим значением count, в количестве не более трех. Например, из следующих записей
Conf1 KW1 5
Conf1 KW2 8
Conf1 KW3 1
Conf1 KW4 6
в представление должны попасть первая, вторая и четвертая. Если есть несколько ключевых слов с одинаковым значением count и в представление нужно включить только часть из них, то отсортируйте эти ключевые слова лексикографически и возьмите первые. Пример:
Conf1 KW2 8
Conf1 KW4 6
Conf1 KW1 5
-----------
Conf1 KW3 5
Задание можно решить многими способами. Как-то явно фантазию ограничивать не будем, но все же постарайтесь не увлекаться. Вы написали и забыли, а проверяющим читать. Постарайтесь написать комментарии ко всем нетривиальным решениям.

27 сентября 2015

Домашнее задание №3

TL;DR: нужно написать код простого приложения, общающегося с БД через API. Исходники для генерации схемы и данных тут: hw03.zip

Установка

Для того, чтобы протестировать приложение, нужно запустить Postgres, создать схему и заполнить БД данными. Команды, создающие схему, и питоновский скрипт, генерирующий данные, предполагают, что Постгрес запущен на локальной машине на стандартном для него порту 5432 и в нем есть пользователь postgres с паролем csc.
Инструкции по установке постгреса для вашей OS ищите на сайте постгреса. Те, кто пользуется Докером (разве кто-то еще не пользуется Докером?), могут установить и запустить постгрес командой
docker run --name postgres-dbms-2015-hw03 -e POSTGRES_PASSWORD=csc -d -p 5432:5432 postgres
Если докеровского образа с постгресом у вас еще нет то он будет скачан (несколько десятков мегабайт). Постгрес запустится так, как написано выше (порт, пользователь, пароль)
Кроме постгреса вам понадобится python. В python 3 скорее всего всё тоже будет работать, но выяснять при проверке и чтении каждого из ваших сорока решений, какой же там нынче используется питон, совершенно не хочется. Поэтому если вы можете использовать Python 2, используйте пожалуйста его.
Для работы с постгресом из питона нужно будет установить пакет psycopg2. Пользователи Ubuntu/Debian могут поставить его командой
apt-get install python-psycopg2
Пользователи других систем - обратитесь к документации об установке питоновских пакетов для вашей системы.

Генерация схемы и данных

В архиве hw03.zip находятся несколько файлов.

-- генерация схемы
psql -h localhost -U postgres < 01_gen_schema.sql
-- заполнение схемы данными
python 02_gen_data.py
-- проход по содержимому таблицы Conference
python 03_scan_conference.py

Докеровский образ с готовыми данными

Можно воспользоваться докеровским образом, в котором уже сгенерирована схема и данные. Команда
docker run --name postgres-dbms-2015-hw03 -d -p 5432:5432 dbarashev/postgres:csc_hw03
должна его скачать и запустить постгрес, в котором уже всё есть. Локальный питон и psycopg2 вам всё равно потребуются.

Схема БД

У вас есть 4 таблицы: University(university_id, name), Researcher(researcher_id, name, university_id), Conference(conference_id, name) и Participant(conference_id, researcher_id). Думаю, что их смысл очевиден из названий таблиц и столбцов.

Задание

Вам нужно написать два скрипта. Первый для каждой конференции должен посчитать количество её участников, работающих в заданном университете. Название университета передавайте в аргументах командной строки. Запуск скрипта должен выглядеть примерно так:
python hw3_01.py Uni42
Второй скрипт должен перевести всех исследователей из одного университета в другой, а первый университет удалить. Названия университетов тоже передавайте в командной строке. Запуск должен выглядеть примерно такЖ
python hw3_02.py Uni42 Uni24
После этого Uni42 должен быть удален, а все, кто в нем работал, должны оказаться в Uni24

Замечания

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

Как сдавать решение

Присылайте решения в виде текстовых файлов с расширением .py в кодировке UTF-8 на адрес dbms@barashev.net. Если можете прицепить два файла, то так и сделайте, если нет, то положите в ZIP архив. Писать код в тексте письма не нужно.

Дедлайн: вечер 12 октября
Если у вас возникнут какие-нибудь нетривиальные идеи, не поленитесь написать комментарий, поясняющий их.

18 сентября 2015

Домашнее задание №2

Задание

Вы делаете информационную систему для рецензирования статей. Она будет работать примерно так:
  • Авторы присылают вам статью - название, текст и список тематических меток, которые они берут из специального единого классификатора. Кроме этого авторы указывают, на какую конференцию они подают статью. Сами авторы вам с точки зрения системы неинтересны и хранить вы их не собираетесь
  • У каждой конференции есть название, место (одно) и даты проведения (начало и конец)
  • У каждой конференции есть программный комитет. У члена программного комитета есть имя, email и известен список тем, из все того же классификатора, в которых он специалист.
  • Статья отправляется на рецензирование нескольким членам программного комитета и каждый ставит ей какую-то оценку -- целое число в интервале [1..4]
Конференций может быть много. Один и тот же ученый может состоять в программных комитетах разных конференций. Член программного комитета может рецензировать много статей. Одноименных объектов не бывает (ни статей, ни конференций, ни ученых).
Составьте схему БД для хранения этих данных. Результатом должен быть скрипт из нескольких операторов CREATE TABLE. Хранить нужно все данные, упомянутые выше, за исключением авторов статьи.

Куда присылать

Присылайте решения на почту dbms@barashev.net  в виде одного текстового файла с расширением .txt или .sql в кодировке UTF-8. Сжимать файл архиватором не нужно. 
Если у вас возникнут какие-нибудь нетривиальные идеи, не поленитесь написать комментарий, поясняющий их.
Срок сдачи:  22 сентября 2015 23:59

10 сентября 2015

Домашнее задание №1

В приложенном файле находится скрипт, который создает в базе данных две таблицы и заполняет их данными.
В таблице Researcher указаны сведения об ученых-исследователях: имя и название университета. В таблице Paper записаны статьи, поданные на конференции: название статьи, список авторов (отдельные авторы разделены запятыми), название и год конференции (год отделен от названия апострофом), место проведения конференции и булевский флажок, означающий, принята статья на конференцию, или нет.
Скрипт можно выполнить командой psql -h localhost -f hw01_dump.sql, опционально добавив аргументы -d <database> и -U <username> и указывая, соответственно, название БД, в которой надо выполнять скрипт и имя пользователя БД, от чьего имени выполняется скрипт

Задание

  1. Напишите запрос, который для заданного университета вернет названия статей, в авторы которых входят ученые этого университета
  2. Напишите запрос, возвращающий университеты, в которых работают ученые, чьи статьи не были приняты на конференцию
  3. Напишите запрос, возвращающий место проведения конференции DBLP'13
  4. Напишите запрос, возвращающий все города из США (USA), в которых проводились конференции.
В процессе написания запросов вы обязательно столкнетесь с некоторыми трудностями. Вы их геройски преодолеете, но подумайте, что можно было бы сделать со схемой и данными, чтобы трудностей было поменьше, и мысли запишите в тексте решения

Куда присылать

Присылайте файлы с кодом и мыслями об улучшении схемы на почту dbms@barashev.net 
Срок сдачи: 15 сентября 2015 23:59

[1] Скрипт hw01_dump.sql

06 сентября 2015

Рекомендации по прохождению практики

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

  • это всего лишь необязательная к исполнению рекомендация.
  • при условии адекватного выбора сложность прохождения практики примерно одинаковая.
  • на практике у Дмитрия Барашева (обозначен в табличке как ДБ) занимаются прикладным программированием на SQL и, возможно, Python.
  • на практике у Дмитрия Зворыгина (обозначен в табличке как ДЗ) занимаются реализацией частей ядра СУБД на C++/Java/других языках

02 сентября 2015

Курс "Базы Данных" в Академическом Университете. Осень 2015

Кому читается

Первый курс магистратуры, направление Software Engineering.

Где и когда

В здании Академического Университета на улице Хлопина. Лекции по средам в 12:00, практика по средам в 14:00.

Отчетность

  • Курс состоит из теоретических лекций и практических занятий. 
  • Отчетностью является практический зачёт и письменный дифференцируемый зачет по теоретической части. 
  • Условия получения или неполучения зачёта по практике определяются преподавателем практики
  • Теоретический зачет состоит из нескольких (до десяти) заданий-вопросов, на которые нужно дать обоснованный ответ.
  • Если практический зачёт получен, то итоговая оценка равна оценке теоретического зачёта. Если он не получен, то из оценки, полученной на теорзачёте, вычитается 1 балл.
  • Какие-либо дополнительные задания, которые возможно будут на лекциях, непосредственного влияния на итоговую оценку не оказывают

    Короткое резюме: если справился с практикой, получишь ровно то, что заработал на теорзачёте. Если не справился с практикой, получишь то, что заработал на теорзачёте минус 1 балл

Практика

Практика у Дмитрия Барашева: изучение методов проектирования схемы БД, написание запросов на SQL. Рекомендуется тем, кто не имеет практического опыта разработки баз данных

Практика у Дмитрия Зворыгина: реализация своей собственной игрушечной СУБД на языке типа Java/C++. Рекомендуется тем, кто достаточно хорошо знаком с SQL и проектированием БД и готов попробовать более сложные задачи. 

Сложность получения зачета в обоих вариантах одинаковая.

Контакты

Электропочта: dbms@barashev.net
Веб: dbms.barashev.net