<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ivsavin</id>
	<title>Wiki - Факультет компьютерных наук - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cs.hse.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ivsavin"/>
	<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Ivsavin"/>
	<updated>2026-09-21T14:27:51Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22892</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22892"/>
		<updated>2017-03-21T07:34:34Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1v8S-0VKJkJc--1CI8rfJc3D0qrL5hCP4FnfXNSyLD1I/edit?usp=sharing Параллельное исполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yRbtjBk_hQSBqUMDTia-quDZGn9T_K1hWkedoa3FfbE/edit?usp=sharing Параллельное исполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1IDKoJFvSnJ0JJe_gRaLCSvIKW6hqrUhr1iSe7fGgS-E/edit?usp=sharing Дополнение к управлению транзакциями]&lt;br /&gt;
&lt;br /&gt;
=== Итоговый тест ===&lt;br /&gt;
[[Базы данных 2/Вопросы]]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (4 штуки) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько (три) тестов в конце второй пары - 20%&lt;br /&gt;
* [[Базы данных 2/Вопросы|Итоговый тест]] (как домашняя работа) - 20%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22891</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22891"/>
		<updated>2017-03-21T06:30:05Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджера транзакций, журнал и менеджера восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSek7ffoAvyeErRCXFkong4dvpqKbV4OLJ8KkgJ1inePig2fGw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализовать планировщик выполнения операций с блокированием: обработку транзакций перед отправкой к BufferManager для исполнения, таблицу блокировок с очередью из операций.&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Нужно добавить SchedulePlanner, получающий операции транзакций от TransactionManager, переформировывающий расписание операций, и отправляющий его в BufferManager. SchedulePlanner также должен использовать таблицу блокировок и очередь транзакций для блокировки конкретных элементов данных (кортежей или отношений).&lt;br /&gt;
* Используйте типы блокировок: shared, exclusive, update и сооветствующую матрицу возможностей блокировки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSfEayeVldmsxDjk2NlSU7DaicnlSnJWWhj8LBE0ZpbAa0y3Nw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22890</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22890"/>
		<updated>2017-03-21T06:17:32Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1v8S-0VKJkJc--1CI8rfJc3D0qrL5hCP4FnfXNSyLD1I/edit?usp=sharing Параллельное исполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yRbtjBk_hQSBqUMDTia-quDZGn9T_K1hWkedoa3FfbE/edit?usp=sharing Параллельное исполнение запросов 2]&lt;br /&gt;
&lt;br /&gt;
=== Итоговый тест ===&lt;br /&gt;
[[Базы данных 2/Вопросы]]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (4 штуки) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько (три) тестов в конце второй пары - 20%&lt;br /&gt;
* [[Базы данных 2/Вопросы|Итоговый тест]] (как домашняя работа) - 20%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B&amp;diff=22889</id>
		<title>Базы данных 2/Вопросы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B&amp;diff=22889"/>
		<updated>2017-03-21T06:16:14Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Форма для сдачи задания: https://goo.gl/forms/qU2OcmBRvtfze5yC2&lt;br /&gt;
&lt;br /&gt;
Срок заполнения до конца 3 апреля 2017 года&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Список вопросов для удобства:&lt;br /&gt;
&lt;br /&gt;
# Перечислите основные функции СУБД.&lt;br /&gt;
# Как организовать хранение BLOB на страницах памяти? Опишите процесс чтения BLOB во время выполнения запроса, указав возможные трудности и варианты их решения.&lt;br /&gt;
# Опишите алгоритм выполнения запроса с диапазоном для kd-дерева. Когда и какие блоки с диска будут считаны?&lt;br /&gt;
# Возможно ли поместить B-дерево в один блок на диске? Какие существуют варианты его структуры и размещения?&lt;br /&gt;
# Опишите двухпроходный алгоритм соединения с хешированием? Покажите на примере: сколько операций чтения/записи блоков с диска будет совершено при произвольном объеме доступной памяти и размерами отношений для выполнения такой операции.&lt;br /&gt;
# Какие этапы разбора запроса следует сделать СУБД, прежде чем она начнет выполнять в памяти операции, связанные с этим запросом? В чем задача каждого этапа, что подается на вход и что получается на выходе?&lt;br /&gt;
# Что такое контрольная точка в контексте транзакций? Приведите пример динамического создания контрольных точек.&lt;br /&gt;
# Опишите пример алгоритма восстановления по журналу транзакций, построенный методом undo/redo. В примере должны быть описаны не менее 3 транзакций с различным исходом на момент сбоя. &lt;br /&gt;
# Какие проблемы решает планировщик расписаний? &lt;br /&gt;
# Каковы функции графа предшествования? Предложите алгоритм проверки эквивалентности расписаний с помощью работы с графом предшествования. &lt;br /&gt;
# Перечислите варианты архитектуры СУБД, в которых возможно параллельное выполнение нескольких транзакций (на менее 3). Для каждой укажите основное преимущество и за счет чего оно достигается.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22888</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22888"/>
		<updated>2017-03-21T06:12:49Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1v8S-0VKJkJc--1CI8rfJc3D0qrL5hCP4FnfXNSyLD1I/edit?usp=sharing Параллельное исполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yRbtjBk_hQSBqUMDTia-quDZGn9T_K1hWkedoa3FfbE/edit?usp=sharing Параллельное исполнение запросов 2]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (4 штуки) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько (три) тестов в конце второй пары - 20%&lt;br /&gt;
* Итоговый тест (как домашняя работа) - 20%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B&amp;diff=22886</id>
		<title>Базы данных 2/Вопросы</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B&amp;diff=22886"/>
		<updated>2017-03-21T01:21:41Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: Новая страница: « &amp;#039;&amp;#039;&amp;#039;Форма для сдачи задания: https://goo.gl/forms/qU2OcmBRvtfze5yC2  Срок заполнения до конца 28 марта 2017 года…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Форма для сдачи задания: https://goo.gl/forms/qU2OcmBRvtfze5yC2&lt;br /&gt;
&lt;br /&gt;
Срок заполнения до конца 28 марта 2017 года&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Список вопросов для удобства:&lt;br /&gt;
&lt;br /&gt;
# Перечислите основные функции СУБД.&lt;br /&gt;
# Как организовать хранение BLOB на страницах памяти? Опишите процесс чтения BLOB во время выполнения запроса, указав возможные трудности и варианты их решения.&lt;br /&gt;
# Опишите алгоритм выполнения запроса с диапазоном для kd-дерева. Когда и какие блоки с диска будут считаны?&lt;br /&gt;
# Возможно ли поместить B-дерево в один блок на диске? Какие существуют варианты его структуры и размещения?&lt;br /&gt;
# Опишите двухпроходный алгоритм соединения с хешированием? Покажите на примере: сколько операций чтения/записи блоков с диска будет совершено при произвольном объеме доступной памяти и размерами отношений для выполнения такой операции.&lt;br /&gt;
# Какие этапы разбора запроса следует сделать СУБД, прежде чем она начнет выполнять в памяти операции, связанные с этим запросом? В чем задача каждого этапа, что подается на вход и что получается на выходе?&lt;br /&gt;
# Что такое контрольная точка в контексте транзакций? Приведите пример динамического создания контрольных точек.&lt;br /&gt;
# Опишите пример алгоритма восстановления по журналу транзакций, построенный методом undo/redo. В примере должны быть описаны не менее 3 транзакций с различным исходом на момент сбоя. &lt;br /&gt;
# Какие проблемы решает планировщик расписаний? &lt;br /&gt;
# Каковы функции графа предшествования? Предложите алгоритм проверки эквивалентности расписаний с помощью работы с графом предшествования. &lt;br /&gt;
# Перечислите варианты архитектуры СУБД, в которых возможно параллельное выполнение нескольких транзакций (на менее 3). Для каждой укажите основное преимущество и за счет чего оно достигается.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22863</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22863"/>
		<updated>2017-03-19T01:04:38Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджера транзакций, журнал и менеджера восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSek7ffoAvyeErRCXFkong4dvpqKbV4OLJ8KkgJ1inePig2fGw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализовать планировщик выполнения операций с блокированием: обработку транзакций перед отправкой к BufferManager для исполнения, таблицу блокировок с очередью из операций.&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Нужно добавить SchedulePlanner, получающий операции транзакций от TransactionManager, переформировывающий расписание операций, и отправляющий его в BufferManager. SchedulePlanner также должен использовать таблицу блокировок и очередь транзакций для блокировки конкретных элементов данных (кортежей или отношений).&lt;br /&gt;
* Алгоритм обработки транзакций и отката нужно &lt;br /&gt;
* Используйте типы блокировок: shared, exclusive, update и сооветствующую матрицу возможностей блокировки.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSfEayeVldmsxDjk2NlSU7DaicnlSnJWWhj8LBE0ZpbAa0y3Nw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22862</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22862"/>
		<updated>2017-03-19T00:54:45Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1v8S-0VKJkJc--1CI8rfJc3D0qrL5hCP4FnfXNSyLD1I/edit?usp=sharing Параллельное исполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yRbtjBk_hQSBqUMDTia-quDZGn9T_K1hWkedoa3FfbE/edit?usp=sharing Параллельное исполнение запросов 2]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22835</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22835"/>
		<updated>2017-03-16T18:29:49Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджера транзакций, журнал и менеджера восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSek7ffoAvyeErRCXFkong4dvpqKbV4OLJ8KkgJ1inePig2fGw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализовать планировщик выполнения операций с блокированием: обработку транзакций перед отправкой к BufferManager для исполнения, таблицу блокировок с очередью из операций.&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Нужно добавить SchedulePlanner, получающий операции транзакций от TransactionManager, переформировывающий расписание операций, и отправляющий его в BufferManager. SchedulePlanner также должен использовать таблицу блокировок и очередь транзакций для блокировки конкретных элементов данных (кортежей или отношений).&lt;br /&gt;
* Алгоритм обработки транзакций и отката нужно &lt;br /&gt;
* Используйте типы блокировок: shared, exclusive, update и сооветствующую матрицу возможностей блокировки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22818</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22818"/>
		<updated>2017-03-14T09:39:19Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSek7ffoAvyeErRCXFkong4dvpqKbV4OLJ8KkgJ1inePig2fGw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализовать планировщик выполнения операций с блокированием: обработку транзакций перед отправкой к BufferManager для исполнения, таблицу блокировок с очередью из операций.&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Нужно добавить SchedulePlanner, получающий операции транзакций от TransactionManager, переформировывающий расписание операций, и отправляющий его в BufferManager. SchedulePlanner также должен использовать таблицу блокировок и очередь транзакций для блокировки конкретных элементов данных (кортежей или отношений).&lt;br /&gt;
* Алгоритм обработки транзакций и отката нужно &lt;br /&gt;
* Используйте типы блокировок: shared, exclusive, update и сооветствующую матрицу возможностей блокировки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22817</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22817"/>
		<updated>2017-03-13T18:54:15Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1v8S-0VKJkJc--1CI8rfJc3D0qrL5hCP4FnfXNSyLD1I/edit?usp=sharing Параллельное исполнение запросов]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22809</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22809"/>
		<updated>2017-03-12T23:51:49Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://docs.google.com/forms/d/e/1FAIpQLSek7ffoAvyeErRCXFkong4dvpqKbV4OLJ8KkgJ1inePig2fGw/viewform?usp=sf_link&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22778</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22778"/>
		<updated>2017-03-06T17:15:05Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1rXA5gpz-fiTwklOooeFznk6_q9pN_1vaIOvy6i1c1o8/edit?usp=sharing Транзакции и бэкапы]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22725</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22725"/>
		<updated>2017-02-28T07:15:05Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 24 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22724</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22724"/>
		<updated>2017-02-28T07:12:30Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). &lt;br /&gt;
* BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
* Во время запуска сервера должна быть возможность указать, что этот запуск в режиме восстановления. При этом RecoverManager должен считать журнал и выполнить операции согласно алгоритму восстановления.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
* Файл журнала можно хранить там же где данные, например, в файле transactions.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22723</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22723"/>
		<updated>2017-02-28T06:55:15Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo для списка запросов, обозначенных как одна транзакция&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
Пояснения:&lt;br /&gt;
* Для обозначения транзакции нужно передать в BufferManager последовательно запросы: BEGIN, UPDATE ..., UPDATE ..., COMMIT. Можно использовать предустановленные результаты разбора запросов (не парсить). BufferManager прежде чем совершить запрос, должен обратиться к TransactionManager и передать ему запрос и идентификатор клиента (можно использовать номер треда). В свою очередь TransactionManager, получив команду BEGIN, должен зафиксировать начало транзакции и затем обрабатывать все последующие операции. Как только TransactionManager успешно выполнит свою работу с запросов, BufferManager может выполнять свои действия (саму операцию). Как только BufferManager выполнил операцию, он обращается к TransactionManager, чтобы тот мог завершить действия по логированию операции.&lt;br /&gt;
* Лог транзакций можно вести в текстовом виде, указывая простые команды типа START transaction_id, WRITE disk_address_to_field old_value new_value, COMMIT transaction_id&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Механизм контрольных точек можно не реализовывать&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 марта&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22722</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22722"/>
		<updated>2017-02-28T06:30:34Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
* Количество ссылок в узле/листе дерева определяется исходя из размера страницы на диске.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22721</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22721"/>
		<updated>2017-02-28T06:24:06Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/gWhAi0fkObLA1uov2&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22720</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22720"/>
		<updated>2017-02-28T06:13:49Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
* Для вставки достаточно брать случайные данные, не парсить запрос. Например, исходя из того, встречается ли в запросе слово insert или select, выполнять операции добавления или выборки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22719</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22719"/>
		<updated>2017-02-28T05:19:55Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Добавить менеджеров транзакций, журнала и восстановления. Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала в режиме undo/redo&lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22689</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22689"/>
		<updated>2017-02-21T07:32:18Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
* [https://docs.google.com/presentation/d/19jvzM4mzmw8TcC1rpldws-SDmzmK2I7zzyaxxBxme1k/edit?usp=sharing Оптимизация запросов]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22688</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22688"/>
		<updated>2017-02-21T07:20:07Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку некластерного индекса (кластерного опционально)&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 3====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Парсинг запроса, составление плана. Возможно, будет пропущено.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 4====&lt;br /&gt;
&lt;br /&gt;
Реализация поддержки транзакций.&lt;br /&gt;
&lt;br /&gt;
* Запись журнала &lt;br /&gt;
* Алгоритм восстановления по журналу&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Задание 5====&lt;br /&gt;
&lt;br /&gt;
Параллельная обработка запросов.&lt;br /&gt;
&lt;br /&gt;
* Реализация пранировщика блокирования&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до TBA&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22687</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22687"/>
		<updated>2017-02-21T07:04:31Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
=== Оценки ===&lt;br /&gt;
* https://docs.google.com/spreadsheets/d/1qCqCfZ04Fa6rUCcqlbWJ51jaVC6erSFV3vPRNYOo2Ks/edit#gid=0&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22633</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22633"/>
		<updated>2017-02-14T17:16:16Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmail.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку кластерного и некластерного индексов.&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22631</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22631"/>
		<updated>2017-02-14T17:13:01Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку кластерного и некластерного индексов.&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Описание взаимодействия ===&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22626</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22626"/>
		<updated>2017-02-14T07:41:55Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PDINXQol-bIQ9UcB3fvSM_s4ZqpA1Bgg-c1KjSJXYKw/edit Выполнение запросов 2]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22625</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22625"/>
		<updated>2017-02-14T07:23:41Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
* Реализовать поддержку кластерного и некластерного индексов.&lt;br /&gt;
&lt;br /&gt;
Информацию об индексах можно хранить в отдельном файле или файлах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22624</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22624"/>
		<updated>2017-02-14T07:08:19Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Для операции добавления нового кортежа достаточно считать в память последний страницу отношения (или реализовать поиск достаточного свободного места в страницах), добавить в него кортеж и записать страницу на диск.&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22623</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22623"/>
		<updated>2017-02-14T07:02:53Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
====Задание 1====&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
* Для перехода к следующему блоку можно также использовать и смещение в текущем файле данных.&lt;br /&gt;
* Так как схема отношения уже определена, дополнительно не нужно хранить ее в блоках или картежах данных. Минимально достаточные данные в блоке: указатель/смещение на следующий блок, внутренняя таблица смещения кортежей, кортежи. В кортежах только данные. Для данных переменной длины (VARCHAR) допустимо использовать любой из методов хранения: указание в первом байте размера поля или указание управляющего символа в конце записи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
====Задание 2====&lt;br /&gt;
* Реализовать вставку кортежей (формирование страниц) и запись страниц на диск. Как только операция добавлени&lt;br /&gt;
* Реализовать поддержку В-дерева: операции добавление, удаление, поиск по дереву.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 1 марта.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22622</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22622"/>
		<updated>2017-02-14T06:34:53Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
Задание 1&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
Замечания:&lt;br /&gt;
&lt;br /&gt;
* В QueryResult атрибут schema указан как список, но на самом деле в результате выполнения запроса нужно иметь только одну схему.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22620</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22620"/>
		<updated>2017-02-14T06:22:16Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
Задание 1&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2 &#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22619</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22619"/>
		<updated>2017-02-14T06:21:57Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
Задание 1&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Для сдачи задания используйте форму: https://goo.gl/forms/81yE6BcY7tZP3wVm2&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22618</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22618"/>
		<updated>2017-02-14T05:17:57Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1_o6b-uSP7lrucN4e-k50QlDqQCkTILvU02bpYzLbINs/edit Выполнение запросов 1]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22582</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22582"/>
		<updated>2017-02-07T07:34:18Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Задания ===&lt;br /&gt;
&lt;br /&gt;
Задание 1&lt;br /&gt;
&lt;br /&gt;
* В СУБД есть чтение доступных таблиц (схем) при старте сервера.&lt;br /&gt;
* При выполнении запроса создается (на данном шаге можно не парсить запрос, а забить предустановленные значения) QueryPlan с операцией чтения из таблицы. QueryPlan содержит операцию full_scan.&lt;br /&gt;
* BufferManager, получив QueryPlan, начинает считывать поблочно из файла с данными и формировать список кортежей для результата.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задание до 14 февраля.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Если есть вопросы, то пишите на почту преподавателю: acccko@gmai.com&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22581</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22581"/>
		<updated>2017-02-07T06:21:51Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1XkL6jWOBm3Ew1oHGJygNblYBTTgPDFjbs9CFWFFwzWo/edit?usp=sharing Структуры индексов]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1yliSRkrgMGYMs7_5k26rriQIy4Vw0DFRJJeiMsNMqSg/edit?usp=sharing Структуры специализированных индексов]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22520</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22520"/>
		<updated>2017-01-31T07:14:27Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
Можно также хранить тип в виде числа объявленного в Const.&lt;br /&gt;
&lt;br /&gt;
Для данного задания точкой входа является BufferManager.executeQuery, который принимает queryPlan - список из операций (Операция определяется как отношение, тип операции (на данном этапе это full_scan) и предикат).&lt;br /&gt;
&lt;br /&gt;
Адресацию в таблице трансляции в BufferManager можно сделать относительно просто воспринимаемой: в качестве ключа в bufferTable нужно указать имя файла данных и смешение относительно начала файла, например: &lt;br /&gt;
&lt;br /&gt;
    table1.data:32&lt;br /&gt;
&lt;br /&gt;
executeQuery запрашивает у SchemaManager файл с данными. Так как нужно выполнить операцию full_scan, то первоначальный адрес страницы, которую нужно загрузить в память будет table1.data:0, нужно проверить, загружена ли она в таблицу трансляции, и если нет, то с помощью DiskManager считать ее.&lt;br /&gt;
&lt;br /&gt;
Также нужно, чтобы у страницы (Page) была ссылка на следующую страницу.&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22519</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22519"/>
		<updated>2017-01-31T06:50:42Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, у которых есть название, тип и размер.&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
===== Описание взаимодействия =====&lt;br /&gt;
&lt;br /&gt;
На данном этапе нужно реализовать подгрузку схемы отношения и взаимодействие менеджера памяти с диском.&lt;br /&gt;
&lt;br /&gt;
Предлагается использовать следующую структуру файловой системы:&lt;br /&gt;
&lt;br /&gt;
    Корень базы&lt;br /&gt;
      --- table.data - файл со страницами с данными&lt;br /&gt;
      --- table.meta - файл со схемой отношения&lt;br /&gt;
&lt;br /&gt;
Формат схемы отношений&lt;br /&gt;
&lt;br /&gt;
Можно ограничиться читабельным форматом, например, перечислить через точку с запятой имя поля, тип и размер (если он есть):&lt;br /&gt;
&lt;br /&gt;
    id;int&lt;br /&gt;
    name;varchar;10&lt;br /&gt;
    dt;datetime&lt;br /&gt;
&lt;br /&gt;
===== Задания =====&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нужному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22518</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22518"/>
		<updated>2017-01-31T06:32:27Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в DiskManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, которые связаны с Type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нжному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22438</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22438"/>
		<updated>2017-01-25T16:13:30Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
Стартовый код и описание: [[Базы данных 2/simpledb]]&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22437</id>
		<title>Базы данных 2/simpledb</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2/simpledb&amp;diff=22437"/>
		<updated>2017-01-25T16:11:50Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: Новая страница: «=== Описание ===  Описание пока что может отличаться от реального кода (какие-то взаимодейс…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Описание пока что может отличаться от реального кода (какие-то взаимодействия еще не дописаны), но концепция скорее всего менять не будет.&lt;br /&gt;
&lt;br /&gt;
Есть Server (SocketServer), который может принять и обработать запрос (RequestHandler), затем отправить клиенту ответ.&lt;br /&gt;
Запрос предварительно парсится на: управляюдище команды, DDL, DML.&lt;br /&gt;
&lt;br /&gt;
Если управляющая команда, то запрос уходит в ControlManager (там можно завершить соединение с клиентом exit)&lt;br /&gt;
&lt;br /&gt;
Если DDL, то запрос отправляется в SchemaManager (там можно запросить список отношений с колонками и индексами, а в будущем создавать и удалять их).&lt;br /&gt;
&lt;br /&gt;
Если запрос DML, то отправляется в QueryManager, который парсит запрос (с помощью QueryParser) и возвращает QueryPlan (список операций, типы операций и отношения, над которыми нужно их делать). Пример операции: table1, full_scan, condition.&lt;br /&gt;
Результат работы QueryParser QueryManager отправляет в BufferManager, в котором происходят все операции. Если BufferManager нужны данные, которых нет в оперативной памяти, он используя SchemaManager отправляет запросы в StorageManager, который возвращает блоки с диска. Получив блоки (и записи в них) в BufferManager, тот считывает записи оттуда с помощью Row и отправляет наверх к QueryParser, тот в свою очередь отправляет результаты назад к CommandManager, который интерпретирует их и выводит в виде строки пользователю.&lt;br /&gt;
&lt;br /&gt;
При старте Server говорит SchemaManager, чтобы тот запустил свою инициализацию, по умолчанию это значит попросит BufferManager записать в оперативную мапять доступные схемы из файлов.&lt;br /&gt;
&lt;br /&gt;
SchemaManager работает с Schema, который состоит из Column, которые связаны с Type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Код ===&lt;br /&gt;
&lt;br /&gt;
* Стартовый код расположен в git-репозитории: https://bitbucket.org/qs/simpledb&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
==== Задание 1 ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Дедлайн будет установлен, когда часть стартового кода для этого задания будет полностью готов, но можно начинать делать)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Организовать работу BufferManager и DiskManager.&lt;br /&gt;
&lt;br /&gt;
1. BufferManager должен использовать свое адресное пространство при загрузке данных с диска (строить таблицу трансляции). Физический адрес - путь к файлу и смещение для перехода к нжному блоку.&lt;br /&gt;
&lt;br /&gt;
2. Добавить команду добавления записей в таблицу. При этом расположение записей на блоке должно быть оптимальным для схемы.&lt;br /&gt;
&lt;br /&gt;
Как только блок заполнен, его нужно сохранить на диск. Если блок изменен, то через несколько операций (или по таймеру) он также долже быть сохранен на диск.&lt;br /&gt;
&lt;br /&gt;
Блок должен относиться к одному отношению. В блоке должны быть: ссылка на схему отношения, ссылка на следующий блок, бит переполнения (используется, если запись не поместилась в блок целиком)&lt;br /&gt;
&lt;br /&gt;
Схема отношения должна содержать адрес файла, в котором находятся блоки с записями.&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9E_%D1%84%D0%B0%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D0%B5%D1%82%D0%B5&amp;diff=22372</id>
		<title>О факультете</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9E_%D1%84%D0%B0%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D0%B5%D1%82%D0%B5&amp;diff=22372"/>
		<updated>2017-01-18T11:45:56Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
== Учебные курсы факультета компьютерных наук==&lt;br /&gt;
&lt;br /&gt;
=== Курсы за 2016/17 учебный год ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 1 курс !! 2 курс !! 3-4 курс !! майноры&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
[[Математический анализ на ПМИ_2016/2017 | Математический анализ на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Линейная алгебра и геометрия_2016/2017 | Линейная алгебра и геометрия на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Дискретная_математика_1_2016/2017 | Дискретная математика-1 на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Основы и методология программирования_2016/2017_пилотный_поток | Основы и методология программирования на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Основы и методология программирования_2016/2017 | Основы и методология программирования на ПМИ (основной поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы_и_структуры_данных_на_ПМИ_(пилотный_поток) | Алгоритмы и структуры данных на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[http://hsealgebra17.wikidot.com/ Алгебра на ПИ]&lt;br /&gt;
&lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
[[Математический анализ_2016/2017 | Математический анализ-3 на ПМИ (основной поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Математически_анализ_3_на_ПМИ_(пилотный_поток) | Математический анализ-3 на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[[DM_2_2016_2017 | Дискретная математика-2 на ПМИ (основной поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Дискретная математика_2_2016/2017 | Дискретная математика-2 на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Алгоритмы и структуры данных_2_2016/2017 | Алгоритмы и структуры данных – 2 на ПМИ (основной поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Теория вероятностей_2016/2017 | Теория вероятностей на ПМИ (основной поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Теория_вероятностей_2016/2017_(пилотный_поток) | Теория вероятностей на ПМИ (пилотный поток)]]&lt;br /&gt;
&lt;br /&gt;
[[Архитектура_компьютеров_и_операционные_системы_2016/2017 | Архитектура компьютеров и операционные системы]]&lt;br /&gt;
&lt;br /&gt;
[[Факультатив_теория_вычислений_2016/2017 | Факультатив теория вычислений на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Дополнительные_главы_теории_вероятностей_(факультатив,_2017) | Дополнительные главы теории вероятностей (факультатив)]]&lt;br /&gt;
&lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
[[НИС_Машинное_обучение_и_приложения_2016/2017 | НИС Машинное обучение и приложения на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Машинное_обучение_1 | Машинное обучение 1 на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Машинное_обучение_2 | Машинное обучение 2 на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Прикладной_статистический_анализ_данных | Прикладной статистический анализ данных на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Численные_методы_в_анализе_данных | Численные методы в анализе данных на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[http://www.machinelearning.ru/wiki/index.php?title=Opt Методы оптимизации на ПМИ (специализации МОП и РС)]&lt;br /&gt;
&lt;br /&gt;
[[НИС_Распределенные_системы_(осень_2016) | НИС Распределенные системы]]&lt;br /&gt;
&lt;br /&gt;
[[Анализ и верификация алгоритмов биржевой торговли | Анализ и верификация алгоритмов для систем биржевой торговли ]]&lt;br /&gt;
&lt;br /&gt;
[[Программирование_на_графических_процессорах | Программирование на графических процессорах]]&lt;br /&gt;
&lt;br /&gt;
[[ЯРПО | Языки разработки ПО (курс по выбору) на ПМИ]]&lt;br /&gt;
&lt;br /&gt;
[[Data analysis (Software Engineering) 2017 | Data analysis  на ПИ]]&lt;br /&gt;
&lt;br /&gt;
[[Базы данных 2 | Компьютерные сети и базы данных 2 ]]&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&lt;br /&gt;
[[Современные_методы_машинного_обучения_(курс_майнора) | Современные методы машинного обучения (курс майнора)]]&lt;br /&gt;
&lt;br /&gt;
[[Майнор_Интеллектуальный_анализ_данных/Введение_в_программирование_2016/2017 | Введение в программирование (курс майнора)]]&lt;br /&gt;
&lt;br /&gt;
[[Майнор Интеллектуальный анализ данных/Введение в анализ данных | Введение в анализ данных (курс майнора)]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|width=100%&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Первая колонка --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Курсы за 2015/16 учебный год ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Технологии программирования|Технологии программирования на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[ОиМП-2015|Основы и методология программирования на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Алгоритмы и структуры данных]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Линейная алгебра и геометрия_2015/2016 | Линейная алгебра и геометрия на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Алгебра_2015/2016 | Алгебра на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[http://hsealgebra.wikidot.com/ Алгебра на ПИ]&lt;br /&gt;
|-&lt;br /&gt;
|[[Компьютерные системы]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Математический анализ на ПМИ_2015/2016 | Математический анализ на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Факультатив_Матпрактикум | Матпрактикум (факультатив) на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Data analysis (Software Engineering)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Майнор Интеллектуальный анализ данных/Введение в программирование|Введение в программирование (курс майнора) на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Майнор Интеллектуальный анализ данных/Введение в анализ данных/2015-2016|Введение в анализ данных (курс майнора) на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[НИС Машинное обучение и приложения|НИС Машинное обучение и приложения на ПМИ]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Архитектура компьютеров и системное программирование (ПМИ_4, 2015/2016)|Архитектура компьютеров и системное программирование (4 курс)]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Дифференциальные уравнения (2 курс, 2015/2016)| Дифференциальные уравнения]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Введение в VBA|Введение в VBA]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
|style=&amp;quot;vertical-align:top;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Вторая колонка --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Курсы за 2014/15 учебный год ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Основы и методологии программирования]]&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Алгоритмы и структуры данных 2015 | Алгоритмы и структуры данных]]&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Анализ данных (Программная инженерия)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Алгебра_2014/2015 | Алгебра]]&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Magolego_sna_2015| MAGoLEGO Social Network Analysis]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Проектная работа ====&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Проектная работа]] &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Учебная практика 1 курс (2016)]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Проектная работа 2 курс (2016)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Завершение двухколоночной таблицы --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Мероприятия факультета компьютерных наук ==&lt;br /&gt;
=== Summer School 2015 ===&lt;br /&gt;
[[Introduction to Natural Language Processing|Introduction to Natural Language Processing]]&lt;br /&gt;
#[[Lecture 1. Introduction|Introduction]]&lt;br /&gt;
#[[Lecture 2. Tokenization and word counts|Tokenization and word counts]]&lt;br /&gt;
#[[Lecture 3. POS tagging. Key word and phrase extraction|POS tagging. Key word and phrase extraction]]&lt;br /&gt;
#[[Lecture 4. Parsing|Parsing]]&lt;br /&gt;
#[[Lecture 5. Language sources|Language sources]]&lt;br /&gt;
#[[Lecture 6. Synonyms and near-synonyms detection|Synonyms and near-synonyms detection]]&lt;br /&gt;
#[[Lecture 8. Suffix trees for NLP|Suffix trees for NLP]]&lt;br /&gt;
#[[NLP References|References]]&lt;br /&gt;
&lt;br /&gt;
== Архив ==&lt;br /&gt;
* [[Учебная практика 1 курс (2015)]]&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22371</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22371"/>
		<updated>2017-01-18T11:33:13Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
* [https://docs.google.com/presentation/d/1PxM-2U72a-VRo5x3kHU54o18jQ36tC0zggN-_XnzNDk/edit?usp=sharing Представление элементов данных]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22329</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22329"/>
		<updated>2017-01-16T09:54:08Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* [https://docs.google.com/presentation/d/1kS8eyUqSXmVZ7_5AS0FdbAER94huceyGFv8UtoAvmyM/edit?usp=sharing Принципы хранения информации]&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22271</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22271"/>
		<updated>2017-01-10T06:32:57Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Контакты ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Tg: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22270</id>
		<title>Базы данных 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_2&amp;diff=22270"/>
		<updated>2017-01-09T23:54:58Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: Новая страница: «== Базы данных ==  Продвинутый курс по БД для специальности РС.  === Лекции === * TODO  === Практиче…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Базы данных ==&lt;br /&gt;
&lt;br /&gt;
Продвинутый курс по БД для специальности РС.&lt;br /&gt;
&lt;br /&gt;
=== Лекции ===&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
=== Практические работы ===&lt;br /&gt;
&lt;br /&gt;
В рамках курса нужно написать свою СУБД, в которой реализовать несколько ключевых механизмов, рассматриваемых в курсе, и обеспечивающих стабильную работу системы.&lt;br /&gt;
&lt;br /&gt;
* Задание 1: Взаимодействие с памятью&lt;br /&gt;
* Задание 2: Индексы&lt;br /&gt;
* Задание 3: Валидация и план запроса&lt;br /&gt;
* Задание 4: Транзакции&lt;br /&gt;
* Задание 5: Параллельное выполнение запросов&lt;br /&gt;
&lt;br /&gt;
Для практических заданий используется Java 8, можно пользоваться преимуществами этой версии (lambda, stream, работа со временем и тд, подробнее http://www.journaldev.com/2389/java-8-features-with-examples и https://www.tutorialspoint.com/java8/java8_overview.htm)&lt;br /&gt;
Может быть полезным: http://web.mit.edu/6.005/www/sp16/&lt;br /&gt;
&lt;br /&gt;
Для тестирования:&lt;br /&gt;
* http://site.mockito.org/&lt;br /&gt;
* http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Расчет оценки ===&lt;br /&gt;
Вклад в оценку:&lt;br /&gt;
* Практические задания (5 штук) - 60%, для зачета обязательно нужно выполнить все задания&lt;br /&gt;
* Несколько тестов в конце второй пары - 30%&lt;br /&gt;
* Итоговый тест (возможно, будет как домашняя работа) - 10%&lt;br /&gt;
* Дополнительные задания на разработку (если пропустили тесты) - 20%&lt;br /&gt;
&lt;br /&gt;
У практических заданий есть дедлайны, каждый просроченный день после дедлайна дает -0.5 к оценке за задание, пока она не станет равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
Основная литература:&lt;br /&gt;
* Системы баз данных. Полный курс. Г. Гарсиа-Молина, Д. Д. Ульман, Д. Уидом, 2004, Главы: 11-19 - частично устаревшее издание&lt;br /&gt;
* Database Systems. The Complete Book, H.García-Molina, J.Ullman, J.Widom 2nd Edition, 2009, Главы 13-20 - более новое издание, но только на английском&lt;br /&gt;
&lt;br /&gt;
Дополнительная литература:&lt;br /&gt;
* &amp;quot;Architecture of a Database System&amp;quot; J.M.Hellerstein, M.Stonebraker, J.Hamilton, 2007&lt;br /&gt;
* https://en.wikibooks.org/wiki/Design_of_Main_Memory_Database_System&lt;br /&gt;
* http://codecapsule.com/tag/key-value-store/&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=20596</id>
		<title>Агрегатор новостей на подобии Meduza.io (командный проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=20596"/>
		<updated>2016-09-21T18:12:38Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: /* Критерии оценки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_командного_проекта&lt;br /&gt;
|name=Агрегатор новостей на подобии Meduza.io&lt;br /&gt;
|company=IPONWEB&lt;br /&gt;
|semester=Осень 2016&lt;br /&gt;
|course=3&lt;br /&gt;
|number_of_students=3-4&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Агрегатор новостных сайтов, также кластеризует новости, находя похожие темы. Также есть админка для коллективной работы над текстами новостей с привязкой к собранным темам.&lt;br /&gt;
&lt;br /&gt;
=== Чему научатся студенты? Что самое интересное в проекте? ===&lt;br /&gt;
* Пример разработки системы агрегации&lt;br /&gt;
* Обработка и анализ текста&lt;br /&gt;
* Разработка системы взаимодействия в реальном времени&lt;br /&gt;
&lt;br /&gt;
=== Организация работы (Как студенты будут работать в команде?) ===&lt;br /&gt;
Основные моменты взаимодействия:&lt;br /&gt;
* Непрерывня интеграция: линтеры кода, прогон тестов, покрытие тестами, сборка пакета и выкладка на прод, работа с конфигурациями. Настройка на примере Jenkins или Phabricator. Работа с конфигурациями через Puppet (или, возможно, Docker или Vagrant)&lt;br /&gt;
* Гибкая методология разработки: бэклог, организация спринтов, оценка сложности задач и сопоставление с фактически потраченным, демо. Технически на примере Trello, RedMine или Phabricator&lt;br /&gt;
* В группе каждые 2 недели (спринт) переходит роль менеджера проекта, чтобы каждый мог попробовать роль пару раз и на планирование не забивали.&lt;br /&gt;
* Взаимные код-ревью: все ревьюят всех.&lt;br /&gt;
* Удаленная работа, встречаться нечасто (например, в конце каждого спринта), но раз в 2-3 дня обязательно синхронизовать результаты и планы в слаке/телеграмме или по почте.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты (Из каких частей состоит проект?) ===&lt;br /&gt;
* Агрегация и работа с разными источниками.&lt;br /&gt;
* Кластеризация новостей, склеивание по общим темам, возможно склеивание в истории с развитием.&lt;br /&gt;
* Параллельная работа в админке (см. Описание Медузы)&lt;br /&gt;
* Редактор новости: проверка правописания, выявление именованных сущностей и рекомендации справки о них, поиск новостей по этой же теме по мере написания материала.&lt;br /&gt;
* Составление рекомендаций связанного контента: по тексту и корректировка по поведению пользователей&lt;br /&gt;
&lt;br /&gt;
Техническое описание устройства Медузы:&lt;br /&gt;
* https://medium.com/meduza-dev/-9dbf37861e11#.tcci76sag&lt;br /&gt;
* https://medium.com/meduza-dev/-f86a924c09a2#.uqcmksrtt&lt;br /&gt;
* https://medium.com/meduza-how-it-works/-1a99202d27a3#.uocxelhaj&lt;br /&gt;
&lt;br /&gt;
Сделать агрегацию нескольких источников, нормализацию текста (и перевод в bag-of-words), затем кластеризацию новостей за последнее время для поиска схожих тем и их развитий.&lt;br /&gt;
&lt;br /&gt;
Админка должна отображать текущие агрегированные темы, тему, на которую составляется новость. Также через веб-сокеты должна быть реализована совместная работа над текстом. Также печатаемый текст проверяется на поиск именованых сущностей для привязки справки по ним.&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Язык разработки непринципиален, подойдет любой, в котором удобно работать с HTTP-запросами, взаимодействовать с СУБД и разрабатывать веб-сервер (например, Python, Ruby, JavaScript)&lt;br /&gt;
&lt;br /&gt;
В качестве платформы подойдут AWS или Google Cloud&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
* Базовое понимание HTTP, опыт работы с API.&lt;br /&gt;
* Опыт веб-разработки&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
* Взаимодействие в команде, методология Agile&lt;br /&gt;
* Архитектура разрабатываемого проекта&lt;br /&gt;
* Составление бэклога и планирование спринтов&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
Минимальные требования (на 4-5):&lt;br /&gt;
*Агрегация по крайне мере 10 источников новостей на русском языке&lt;br /&gt;
*Нормализация (составление bag of words, векторной модели новостей)&lt;br /&gt;
*Кластеризация новостей по схожести, определение дубликатов&lt;br /&gt;
*Веб-сайт с лентой новостей с кешированием.&lt;br /&gt;
&lt;br /&gt;
Требования (на 6-7):&lt;br /&gt;
*Выделение именованных сущностей в тексте и связка с другими новостями по ним или страницами википедии.&lt;br /&gt;
*Агрегация добавляемых аккаунтов социальных медиа: фейсбук, жж. + Несложный классификатор, похож ли пост на информационный повод (например, по длине поста, наличию именованных сущностей, слов из заданного списка, ссылок)&lt;br /&gt;
*Админка для работы с новостями на веб-сокетах для совместных правок и работы выпускающего редактора: редактирование текста, блокировка полей для других при редактировании, сохранение истории изменений и чат/комментарии.&lt;br /&gt;
&lt;br /&gt;
Требования (на 8-10):&lt;br /&gt;
*Интеграция с Яндекс.Метрикой через API - подгрузка и кеширование данных о просмотревших новость (демография, интересы, регион и тд)&lt;br /&gt;
*Система персональной рекомендации контента на основе фич новости и данных из Метрики.&lt;br /&gt;
*Конструктор верстки текста новости. + AMP версия.&lt;br /&gt;
*Работа с твиттером: мониторинг трендов, отслеживание добавляемых аккаунтов, экспорт и визуализация твиттов и диалогов в новости.&lt;br /&gt;
*Пуш-уведомления о новостях.&lt;br /&gt;
&lt;br /&gt;
Требования (на вероятность создать в итоге успешный сервис для СМИ):&lt;br /&gt;
* Код соответствует современным стандартам кодирования&lt;br /&gt;
* Актуальная документация по работе процессов сервиса&lt;br /&gt;
* Покрытие тестами, юнит-тесты, функциональные и интеграционные тесты&lt;br /&gt;
* Проведен UX-анализ основных интерфейсов и сценариев пользователей&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Точные требования на 6-10 будут сформулированы на первых занятиях исходя из составленного бэклога и уровня подготовки участников проекта.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Похожие проекты ===&lt;br /&gt;
* Яндекс.Новости, Google News - агрегация&lt;br /&gt;
* Meduza.io - редактирование новостей&lt;br /&gt;
&lt;br /&gt;
=== Контактная информация ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Телеграмм: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B5%D0%BC%D0%BE%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19992</id>
		<title>Навигатор маршрутов для немоторного транспорта (командный проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B5%D0%BC%D0%BE%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19992"/>
		<updated>2016-08-30T16:59:12Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: Новая страница, с помощью формы Новый_командный_проект&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_командного_проекта&lt;br /&gt;
|name=Навигатор маршрутов для немоторного транспорта&lt;br /&gt;
|company=IPONWEB&lt;br /&gt;
|semester=Осень 2016&lt;br /&gt;
|course=3&lt;br /&gt;
|number_of_students=4-5&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Сервис на основе Яндекс.Карт, на котором оцениваются, насколько удобно ездить на транспорте с небольшими колесами (роликах, самокате, скейте). Также можно прокладывать маршруты в зависимости от выбранного транспорта.&lt;br /&gt;
&lt;br /&gt;
=== Чему научатся студенты? Что самое интересное в проекте? ===&lt;br /&gt;
* Работа с геоданными: хранение, выборка, обработка, привязка маршрутов&lt;br /&gt;
* Цифровая обработка сигналов: в случае автоматизированного обновления информации о качестве дорожек нужно будет разобраться с обработкой данный, очистить их от шума, классифицировать различные выбросы.&lt;br /&gt;
&lt;br /&gt;
=== Организация работы (Как студенты будут работать в команде?) ===&lt;br /&gt;
Основные моменты взаимодействия:&lt;br /&gt;
* Непрерывня интеграция: линтеры кода, прогон тестов, покрытие тестами, сборка пакета и выкладка на прод, работа с конфигурациями. Настройка на примере Jenkins или Phabricator. Работа с конфигурациями через Puppet (или, возможно, Docker или Vagrant)&lt;br /&gt;
* Гибкая методология разработки: бэклог, организация спринтов, оценка сложности задач и сопоставление с фактически потраченным, демо. Технически на примере Trello, RedMine или Phabricator&lt;br /&gt;
* В группе каждые 2 недели (спринт) переходит роль менеджера проекта, чтобы каждый мог попробовать роль пару раз и на планирование не забивали.&lt;br /&gt;
* Взаимные код-ревью: все ревьюят всех.&lt;br /&gt;
* Удаленная работа, встречаться нечасто (например, в конце каждого спринта), но раз в 2-3 дня обязательно синхронизовать результаты и планы в слаке/телеграмме или по почте.&lt;br /&gt;
&lt;br /&gt;
=== Компоненеты (Из каких частей состоит проект?) ===&lt;br /&gt;
* Веб-сервис с использованием API Яндекс.Карт для проложения маршрутов и отметок свойств дорожек.&lt;br /&gt;
* Мобильный клиент для верификации и отправки данных о дорожках.&lt;br /&gt;
* В зависимости от источников данных:&lt;br /&gt;
* Анализ данных с виброметра на предмет оценки качества дорожки (нужно учитывать шумы, характер движения, одиночные препядствия типа бордюров)&lt;br /&gt;
* Анализатор изображений дорог: классификация по качеству&lt;br /&gt;
* Система проложения маршрута исходя из транспорта пользователя&lt;br /&gt;
&lt;br /&gt;
Вариант сбора информации (достаточно реализовать первый и какой-либо из двух других, но лучше попробовать все):&lt;br /&gt;
* Пользователи сами отмечают участки и качество дорог (дефолтный вариант)&lt;br /&gt;
* Можно присоединить к своему транспортному средству телефон с приложением, которое на основе виброметра, которое собирает данные, затем отправляет серверу или анализирует самостоятельно. Пользователь верифицирует данные, чтобы избежать неточности координат или характера его поездки.&lt;br /&gt;
* Парсить Яндекс.Панорамы (или попросить датасет нижних частей фотографий) и по ним (видимо через нейросеть) определять, где начинается бордюр или является ли дорожка пешеходной, тип дорожки (брусчатка, качество асфальт).&lt;br /&gt;
Информация на панорамах также может устаревать, поэтому лучше использовать все три варианта сбора информации.&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
* API Яндекс.Карт&lt;br /&gt;
* Возможно, API Панорам Яндекс.Карт&lt;br /&gt;
* Возможно, интерфейсы доступа к датчикам смартфона (React Native, Cordova или Swift, Java)&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
* Поможет умение анализировать функции, знание разложения функций в ряды&lt;br /&gt;
* Желателен опыт работы с геоданными&lt;br /&gt;
* Желателен опыт мобильной разработки&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
* Взаимодействие в команде, методология Agile&lt;br /&gt;
* Архитектура разрабатываемого проекта&lt;br /&gt;
* Составление бэклога и планирование спринтов&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
Минимальные требования (на 4-5):&lt;br /&gt;
&lt;br /&gt;
* Организована система хранения маршрутов и привязки их к API карт.&lt;br /&gt;
* Есть веб-интерфейс, через который можно указать часть маршрута и отметить качество дорожки.&lt;br /&gt;
* Разработан мобильный клиент для сервиса, через который можно также вносить информацию о маршрутах.&lt;br /&gt;
&lt;br /&gt;
Точные требования на 6-10 будут сформулированы на первых занятиях исходя из составленного бэклога и уровня подготовки участников проекта.&lt;br /&gt;
&lt;br /&gt;
=== Похожие проекты ===&lt;br /&gt;
* Яндекс.Пробки отчасти похож принципом действия: агрегация информации от агентов (телефонов и уличных камер) о скорости и пользователей об авариях.&lt;br /&gt;
&lt;br /&gt;
=== Контактная информация ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Телеграмм: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81_%D1%83%D1%87%D0%B5%D1%82%D0%B0_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19990</id>
		<title>Сервис учета и классификации активности (командный проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81_%D1%83%D1%87%D0%B5%D1%82%D0%B0_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19990"/>
		<updated>2016-08-30T14:02:19Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: Новая страница, с помощью формы Новый_командный_проект&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_командного_проекта&lt;br /&gt;
|name=Сервис учета и классификации активности&lt;br /&gt;
|company=IPONWEB&lt;br /&gt;
|semester=Осень 2016&lt;br /&gt;
|course=3&lt;br /&gt;
|number_of_students=4-5&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Сервис, собирающий информацию об активности пользователя с различных устройств и браузера и размечающий активности как продуктивные/непродуктивные.&lt;br /&gt;
&lt;br /&gt;
=== Чему научатся студенты? Что самое интересное в проекте? ===&lt;br /&gt;
Наиболее интересные компоненты проекта:&lt;br /&gt;
* Классификатор активности. Можно по словам в заголовке, можно выкачивать списки приложений (игр, ide, офисных пакетов) или даже получать информацию через их апи во время получения неизвестной активности.&lt;br /&gt;
* Учет активности с разных устройств. Например, если человек листает учебник на планшете и делает заметки на ноутбуке, то нужно смержить эти активности как общепродуктивные. Идеально разработать хралинище паттернов поведения и учитывать активность в целом.&lt;br /&gt;
&lt;br /&gt;
=== Организация работы (Как студенты будут работать в команде?) ===&lt;br /&gt;
Основные моменты взаимодействия:&lt;br /&gt;
* Непрерывня интеграция: линтеры кода, прогон тестов, покрытие тестами, сборка пакета и выкладка на прод, работа с конфигурациями. Настройка на примере Jenkins или Phabricator. Работа с конфигурациями через Puppet (или, возможно, Docker или Vagrant)&lt;br /&gt;
* Гибкая методология разработки: бэклог, организация спринтов, оценка сложности задач и сопоставление с фактически потраченным, демо. Технически на примере Trello, RedMine или Phabricator&lt;br /&gt;
* В группе каждые 2 недели (спринт) переходит роль менеджера проекта, чтобы каждый мог попробовать роль пару раз и на планирование не забивали.&lt;br /&gt;
* Взаимные код-ревью: все ревьюят всех.&lt;br /&gt;
* Удаленная работа, встречаться нечасто (например, в конце каждого спринта), но раз в 2-3 дня обязательно синхронизовать результаты и планы в слаке/телеграмме или по почте.&lt;br /&gt;
&lt;br /&gt;
=== Компоненеты (Из каких частей состоит проект?) ===&lt;br /&gt;
* Сервер принимающий информацию от агентов.&lt;br /&gt;
* Графики разной статистики в веб-кабинете пользователя (можно взять за основу код grafana)&lt;br /&gt;
* Клиенты: для десктопов (для начала можно ограничиться одной платформой Ubuntu/OSX и писать на Electron), плагины для браузера (на Greasemonkey и Tampermonkey), клиенты для мобильных устройств (можно использовать кросс-платформенные фреймворки типа Ionic)&lt;br /&gt;
* Сервер: Язык не принципиален нужно сделать REST API, СУБД: InfluxDB и скорее всего для хранения фич разных приложений (заголовков) понадобится MongoDB.&lt;br /&gt;
* ETL-сервисы и классификаторы активностей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Техническое описание:&lt;br /&gt;
* Пользователь устанавливает агенты сервиса на своих устройствах, агенты отправляют на сервер данные об активностях пользователя.&lt;br /&gt;
* Агент должен отправлять только заголовок активного окна. При этом не всегда можно отследить изменение окна без переключения программы, поэтому для браузеров может понадобиться плагин.&lt;br /&gt;
* Агент также должен агрегировать информацию находясь в оффлайн и отправлять при появлении соединения.&lt;br /&gt;
* Предлагается попробовать InfluxDB для хранения метрик. Также понадобится спроектировать алгоритм учета активностей, поступающих с разных устройств в одно время (недостаток всех существующих сервисов этой категории).&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
* Фреймворки Electron, React Native - для кросс-платформенных клиентов. &lt;br /&gt;
* Возможно, понадобится более низкоуровневое программирование под конкретные ОС: Swift, Java, C#, etc&lt;br /&gt;
* InfluxDB в качестве основной СУБД&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
* Опыт веб-разработки сервисов с REST API&lt;br /&gt;
* Желателен опыт разработки приложений с взаимодействием с компонентами различных ОС.&lt;br /&gt;
* Желателен опыт кросс-платформенной разработки приложений.&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
* Взаимодействие в команде, методология Agile&lt;br /&gt;
* Архитектура разрабатываемого проекта&lt;br /&gt;
* Составление бэклога и планирование спринтов&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
Минимальные требования (на 4-5 баллов):&lt;br /&gt;
* Разработан агент под Ubuntu, собирающий активность пользователя и отправляющий ее на сервер&lt;br /&gt;
* Разработан сервер, агрегирующий информацию об активности пользователя.&lt;br /&gt;
* Разработан веб-сайт, через который пользователь может просматривать статистику своей активности, отмечать активность как продуктивную или нет.&lt;br /&gt;
* Разработан классификатор активностей на основе слов, встречающихся в заголовках активных окон и отметок пользователя.&lt;br /&gt;
&lt;br /&gt;
Точные требования на 6-10 будут сформулированы на первых занятиях исходя из составленного бэклога и уровня подготовки участников проекта.&lt;br /&gt;
&lt;br /&gt;
=== Похожие проекты ===&lt;br /&gt;
* Rescuetime&lt;br /&gt;
* Project Hamster&lt;br /&gt;
&lt;br /&gt;
=== Контактная информация ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Телеграмм: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19984</id>
		<title>Агрегатор новостей на подобии Meduza.io (командный проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19984"/>
		<updated>2016-08-29T18:35:34Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_командного_проекта&lt;br /&gt;
|name=Агрегатор новостей на подобии Meduza.io&lt;br /&gt;
|company=IPONWEB&lt;br /&gt;
|semester=Осень 2016&lt;br /&gt;
|course=3&lt;br /&gt;
|number_of_students=3-4&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Агрегатор новостных сайтов, также кластеризует новости, находя похожие темы. Также есть админка для коллективной работы над текстами новостей с привязкой к собранным темам.&lt;br /&gt;
&lt;br /&gt;
=== Чему научатся студенты? Что самое интересное в проекте? ===&lt;br /&gt;
* Пример разработки системы агрегации&lt;br /&gt;
* Обработка и анализ текста&lt;br /&gt;
* Разработка системы взаимодействия в реальном времени&lt;br /&gt;
&lt;br /&gt;
=== Организация работы (Как студенты будут работать в команде?) ===&lt;br /&gt;
Основные моменты взаимодействия:&lt;br /&gt;
* Непрерывня интеграция: линтеры кода, прогон тестов, покрытие тестами, сборка пакета и выкладка на прод, работа с конфигурациями. Настройка на примере Jenkins или Phabricator. Работа с конфигурациями через Puppet (или, возможно, Docker или Vagrant)&lt;br /&gt;
* Гибкая методология разработки: бэклог, организация спринтов, оценка сложности задач и сопоставление с фактически потраченным, демо. Технически на примере Trello, RedMine или Phabricator&lt;br /&gt;
* В группе каждые 2 недели (спринт) переходит роль менеджера проекта, чтобы каждый мог попробовать роль пару раз и на планирование не забивали.&lt;br /&gt;
* Взаимные код-ревью: все ревьюят всех.&lt;br /&gt;
* Удаленная работа, встречаться нечасто (например, в конце каждого спринта), но раз в 2-3 дня обязательно синхронизовать результаты и планы в слаке/телеграмме или по почте.&lt;br /&gt;
&lt;br /&gt;
=== Компоненеты (Из каких частей состоит проект?) ===&lt;br /&gt;
* Агрегация и работа с разными источниками.&lt;br /&gt;
* Кластеризация новостей, склеивание по общим темам, возможно склеивание в истории с развитием.&lt;br /&gt;
* Параллельная работа в админке (см. Описание Медузы)&lt;br /&gt;
* Редактор новости: проверка правописания, выявление именованных сущностей и рекомендации справки о них, поиск новостей по этой же теме по мере написания материала.&lt;br /&gt;
* Составление рекомендаций связанного контента: по тексту и корректировка по поведению пользователей&lt;br /&gt;
&lt;br /&gt;
Техническое описание устройства Медузы:&lt;br /&gt;
* https://medium.com/meduza-dev/-9dbf37861e11#.tcci76sag&lt;br /&gt;
* https://medium.com/meduza-dev/-f86a924c09a2#.uqcmksrtt&lt;br /&gt;
* https://medium.com/meduza-how-it-works/-1a99202d27a3#.uocxelhaj&lt;br /&gt;
&lt;br /&gt;
Сделать агрегацию нескольких источников, нормализацию текста (и перевод в bag-of-words), затем кластеризацию новостей за последнее время для поиска схожих тем и их развитий.&lt;br /&gt;
&lt;br /&gt;
Админка должна отображать текущие агрегированные темы, тему, на которую составляется новость. Также через веб-сокеты должна быть реализована совместная работа над текстом. Также печатаемый текст проверяется на поиск именованых сущностей для привязки справки по ним.&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Язык разработки непринципиален, подойдет любой, в котором удобно работать с HTTP-запросами, взаимодействовать с СУБД и разрабатывать веб-сервер (например, Python, Ruby, JavaScript)&lt;br /&gt;
&lt;br /&gt;
В качестве платформы подойдут AWS или Google Cloud&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
* Базовое понимание HTTP, опыт работы с API.&lt;br /&gt;
* Опыт веб-разработки&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
* Взаимодействие в команде, методология Agile&lt;br /&gt;
* Архитектура разрабатываемого проекта&lt;br /&gt;
* Составление бэклога и планирование спринтов&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
Минимальные требования (на 4-5):&lt;br /&gt;
 * Агрегация по крайне мере 10 источников новостей на русском языке&lt;br /&gt;
 * Нормализация (составление bag of words, векторной модели новостей)&lt;br /&gt;
 * Кластеризация новостей по схожести, определение дубликатов&lt;br /&gt;
&lt;br /&gt;
Точные требования на 6-10 будут сформулированы на первых занятиях исходя из составленного бэклога и уровня подготовки участников проекта.&lt;br /&gt;
&lt;br /&gt;
=== Похожие проекты ===&lt;br /&gt;
* Яндекс.Новости, Google News - агрегация&lt;br /&gt;
* Meduza.io - редактирование новостей&lt;br /&gt;
&lt;br /&gt;
=== Контактная информация ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Телеграмм: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
	<entry>
		<id>https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19983</id>
		<title>Агрегатор новостей на подобии Meduza.io (командный проект)</title>
		<link rel="alternate" type="text/html" href="https://wiki.cs.hse.ru/index.php?title=%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D1%80_%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%B8%D0%B8_Meduza.io_(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)&amp;diff=19983"/>
		<updated>2016-08-29T18:34:43Z</updated>

		<summary type="html">&lt;p&gt;Ivsavin: /* Компоненеты (Из каких частей состоит проект?) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка_командного_проекта&lt;br /&gt;
|name=Агрегатор новостей на подобии Meduza.io&lt;br /&gt;
|company=IPONWEB&lt;br /&gt;
|semester=Осень 2016&lt;br /&gt;
|course=3&lt;br /&gt;
|number_of_students=3-4&lt;br /&gt;
|categorize=yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Что это за проект? ===&lt;br /&gt;
Агрегатор новостных сайтов, также кластеризует новости, находя похожие темы. Также есть админка для коллективной работы над текстами новостей с привязкой к собраным темам.&lt;br /&gt;
&lt;br /&gt;
=== Чему научатся студенты? Что самое интересное в проекте? ===&lt;br /&gt;
* Пример разработки системы агрегации&lt;br /&gt;
* Обработка и анализ текста&lt;br /&gt;
* Разработка системы взаимодействия в реальном времени&lt;br /&gt;
&lt;br /&gt;
=== Организация работы (Как студенты будут работать в команде?) ===&lt;br /&gt;
Основные моменты взаимодействия:&lt;br /&gt;
* Непрерывня интеграция: линтеры кода, прогон тестов, покрытие тестами, сборка пакета и выкладка на прод, работа с конфигурациями. Настройка на примере Jenkins или Phabricator. Работа с конфигурациями через Puppet (или, возможно, Docker или Vagrant)&lt;br /&gt;
* Гибкая методология разработки: бэклог, организация спринтов, оценка сложности задач и сопоставление с фактически потраченным, демо. Технически на примере Trello, RedMine или Phabricator&lt;br /&gt;
* В группе каждые 2 недели (спринт) переходит роль менеджера проекта, чтобы каждый мог попробовать роль пару раз и на планирование не забивали.&lt;br /&gt;
* Взаимные код-ревью: все ревьюят всех.&lt;br /&gt;
* Удаленная работа, встречаться нечасто (например, в конце каждого спринта), но раз в 2-3 дня обязательно синхронизовать результаты и планы в слаке/телеграмме или по почте.&lt;br /&gt;
&lt;br /&gt;
=== Компоненеты (Из каких частей состоит проект?) ===&lt;br /&gt;
* Агрегация и работа с разными источниками.&lt;br /&gt;
* Кластеризация новостей, склеивание по общим темам, возможно склеивание в истории с равзитием.&lt;br /&gt;
* Параллельная работа в админке (см. Описание Медузы)&lt;br /&gt;
* Редактор новости: проверка правописания, выявление именованных сущностей и рекомендации справки о них, поиск новостей по этой же теме по мере написания материала.&lt;br /&gt;
* Составление рекомендаций связанного контента: по тексту и корректировка по поведению пользователей&lt;br /&gt;
&lt;br /&gt;
Техническое описание устройства Медузы:&lt;br /&gt;
* https://medium.com/meduza-dev/-9dbf37861e11#.tcci76sag&lt;br /&gt;
* https://medium.com/meduza-dev/-f86a924c09a2#.uqcmksrtt&lt;br /&gt;
* https://medium.com/meduza-how-it-works/-1a99202d27a3#.uocxelhaj&lt;br /&gt;
&lt;br /&gt;
Сделать агрегацию нескольких источников, нормализацию текста (и перевод в bag-of-words), затем кластеризацию новостей за последнее время для поиска схожих тем и их развитий.&lt;br /&gt;
&lt;br /&gt;
Админка должна отображать текущие агрегированные темы, тему, на которую составляется новость. Также через веб-сокеты должна быть реализована совместная работа над текстом. Также печатаемый текст проверяется на поиск именованых сущностей для привязки справки по ним.&lt;br /&gt;
&lt;br /&gt;
=== Какие будут использоваться технологии? ===&lt;br /&gt;
Язык разработки непринципиален, подойдет любой, в котором удобно работать с HTTP-запросами, взаимодействовать с СУБД и разрабатывать веб-сервер (например, Python, Ruby, JavaScript)&lt;br /&gt;
&lt;br /&gt;
В качестве платформы подойдут AWS или Google Cloud&lt;br /&gt;
&lt;br /&gt;
=== Какие начальные требования? ===&lt;br /&gt;
* Базовое понимание HTTP, опыт работы с API.&lt;br /&gt;
* Опыт веб-разработки&lt;br /&gt;
&lt;br /&gt;
=== Темы вводных занятий ===&lt;br /&gt;
* Взаимодействие в команде, методология Agile&lt;br /&gt;
* Архитектура разрабатываемого проекта&lt;br /&gt;
* Составление бэклога и планирование спринтов&lt;br /&gt;
&lt;br /&gt;
=== Критерии оценки ===&lt;br /&gt;
Минимальные требования (на 4-5):&lt;br /&gt;
 * Агрегация по крайне мере 10 источников новостей на русском языке&lt;br /&gt;
 * Нормализация (составление bag of words, векторной модели новостей)&lt;br /&gt;
 * Кластеризация новостей по схожести, определение дубликатов&lt;br /&gt;
&lt;br /&gt;
Точные требования на 6-10 будут сформулированы на первых занятиях исходя из составленного бэклога и уровня подготовки участников проекта.&lt;br /&gt;
&lt;br /&gt;
=== Похожие проекты ===&lt;br /&gt;
* Яндекс.Новости, Google News - агрегация&lt;br /&gt;
* Meduza.io - редактирование новостей&lt;br /&gt;
&lt;br /&gt;
=== Контактная информация ===&lt;br /&gt;
* Почта: acccko@gmail.com&lt;br /&gt;
* Телеграмм: @acccko&lt;/div&gt;</summary>
		<author><name>Ivsavin</name></author>
	</entry>
</feed>