Базы данных/Лабораторная работа 5: различия между версиями
Ivsavin (обсуждение | вклад) |
Ivsavin (обсуждение | вклад) |
||
| Строка 51: | Строка 51: | ||
== Моделирование данных в MongoDB == | == Моделирование данных в MongoDB == | ||
Так как MongoDB не стремится экономить место на диске, а наоборот активно резервирует место под обновления данных, итоговая база занимает более 30Гб. В данной лабораторной работе рассматривается только сущность фильмов и связанные с ней факты (информация аналогичная хранимой в title, movie_info, keywords). | |||
Схема модели данных в MongoDB: | Схема модели данных в MongoDB: | ||
https://www.packtpub.com/sites/default/files/new_blog_images/147/1-flatmodel.gif | https://www.packtpub.com/sites/default/files/new_blog_images/147/1-flatmodel.gif | ||
В дампе базы есть коллекции: | |||
* Movie - для заголовков фильмов, ключевых слов и некоторых фактов | |||
* MovieDoc - для длинных текстовых фактов (описания, цитаты и тд) | |||
=== Коллекция Movie === | |||
Это основная коллекция, ключом в которой является отформатированная строка, состоящая из: названия фильма, года выпуска, названия эпизода (для сериалов). Пример поиска сериала и эпизода по ключу: | |||
db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005)"}) // выбрать сериал или фильм | |||
db.Movie.find({"SeriesID" : "\"12 oz. Mouse\" (2005)"}) // выбрать сериал и все эпизоды | |||
db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005) {Adventure Mouse (#1.7)}"}) // выбрать конкретный эпизод | |||
Для удобства восприятия информации используйте .pretty(): | |||
> db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005)"}).pretty() | |||
{ | |||
"AltTitles" : [ | |||
"\"12 Ouns Mouce\" (2005)", | |||
"\"Oz. Mo\" (2005)" | |||
], | |||
"Countries" : [ | |||
"USA" | |||
], | |||
"Genres" : [ | |||
"Animation", | |||
"Comedy" | |||
], | |||
"Keywords" : [ | |||
"abbreviation-in-title", | |||
"absurdism", | |||
"adult-animation", | |||
"animal-in-title", | |||
"avant-garde", | |||
"beer", | |||
"character-name-in-title", | |||
"digit-in-title", | |||
"drunkenness", | |||
"late-night", | |||
"mouse", | |||
"non-sequitur", | |||
"number-in-title", | |||
"period-in-title", | |||
"surrealism" | |||
], | |||
"Languages" : [ | |||
"English" | |||
], | |||
"Locations" : [ | |||
"Atlanta, Georgia, USA" | |||
], | |||
"MovieID" : "\"12 oz. Mouse\" (2005)", | |||
"Parental" : { | |||
"Certificates" : [ | |||
"Australia:MA15+", | |||
"Canada:14+\t(TV rating)", | |||
"New Zealand:M", | |||
"USA:TV-14", | |||
"USA:TV-MA\t(one episode)" | |||
] | |||
}, | |||
"Rating" : { | |||
"RatingDist" : "1000001103", | |||
"Rating" : "6.9", | |||
"RatingVotes" : "1365" | |||
}, | |||
"ReleaseYear" : "2005", | |||
"RunningTime" : "15", | |||
"SeriesEndYear" : "", | |||
"SeriesID" : "\"12 oz. Mouse\" (2005)", | |||
"SeriesType" : "S", | |||
"Technical" : { | |||
"Colors" : [ | |||
"Color" | |||
] | |||
}, | |||
"_id" : "\"12 oz. Mouse\" (2005)" | |||
} | |||
Расшифровка SeriesType: | |||
* F - фильм | |||
* S - сериал | |||
* E - эпизод | |||
=== Индексы === | === Индексы === | ||
Версия от 00:02, 4 июня 2016
Задачи лабораторной работы:
- Установить MongoDB
- Рассмотреть различия в моделировании данных для реляционных БД и документоориентированных.
- Попрактиковаться в составлении запросов к MongoDB: добавление, обновление, селекция, фильтрация, агрегация.
- Настроить репликацию данных, инициировать отключение мастер-узла в процессе интенсивного обновления данных, проанализировать действия сервера и проверить целостность измененных данных.
Установка MongoDB
Для лабораторных работ достаточно версии 2.4+
- Ubuntu: sudo apt-get install mongodb
- Mac OS: brew install mongodb Подробнее
- Windows: Скачать установщик: https://www.mongodb.com/download-center#community
Импорт данных
Коллекции, содержащие фильмы и длинные текстовые факты о фильмах:
Для импорта коллекций в базу movies выполните:
bzip2 -dc movies.bson.bz2 | mongoimport -d movies -c Movie bzip2 -dc moviesdocs.bson.bz2 | mongoimport -d movies -c MovieDoc
Импортированная коллекция займет примерно 6Гб на диске.
Чтобы проверить корректность импорта, зайдите в консоль MongoDB:
mongo
Показать базы данных:
show dbs;
Переключиться на базу данных (если ее нет, то создастся):
use movies
Показать коллекции текущей базы данных:
show collections;
Экспорт данных
В случае, если понадобится экспортировать данные, то сделать это можно (для версий 2.*) по коллекциям, запуская:
mongoexport --db movies -c MovieDoc -o - | bzip2 - > moviesdocs.bson.bz2 mongoexport --db movies -c Movie -o - | bzip2 - > movies.bson.bz2
Если вы создадите индексы, то они будут лежать в отдельной коллекции, ее также нужно экспортировать.
Моделирование данных в MongoDB
Так как MongoDB не стремится экономить место на диске, а наоборот активно резервирует место под обновления данных, итоговая база занимает более 30Гб. В данной лабораторной работе рассматривается только сущность фильмов и связанные с ней факты (информация аналогичная хранимой в title, movie_info, keywords).
Схема модели данных в MongoDB:
В дампе базы есть коллекции:
- Movie - для заголовков фильмов, ключевых слов и некоторых фактов
- MovieDoc - для длинных текстовых фактов (описания, цитаты и тд)
Коллекция Movie
Это основная коллекция, ключом в которой является отформатированная строка, состоящая из: названия фильма, года выпуска, названия эпизода (для сериалов). Пример поиска сериала и эпизода по ключу:
db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005)"}) // выбрать сериал или фильм
db.Movie.find({"SeriesID" : "\"12 oz. Mouse\" (2005)"}) // выбрать сериал и все эпизоды
db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005) {Adventure Mouse (#1.7)}"}) // выбрать конкретный эпизод
Для удобства восприятия информации используйте .pretty():
> db.Movie.find({"_id" : "\"12 oz. Mouse\" (2005)"}).pretty()
{
"AltTitles" : [ "\"12 Ouns Mouce\" (2005)", "\"Oz. Mo\" (2005)" ], "Countries" : [ "USA" ], "Genres" : [ "Animation", "Comedy" ], "Keywords" : [ "abbreviation-in-title", "absurdism", "adult-animation", "animal-in-title", "avant-garde", "beer", "character-name-in-title", "digit-in-title", "drunkenness", "late-night", "mouse", "non-sequitur", "number-in-title", "period-in-title", "surrealism" ], "Languages" : [ "English" ], "Locations" : [ "Atlanta, Georgia, USA" ], "MovieID" : "\"12 oz. Mouse\" (2005)", "Parental" : { "Certificates" : [ "Australia:MA15+", "Canada:14+\t(TV rating)", "New Zealand:M", "USA:TV-14", "USA:TV-MA\t(one episode)" ] }, "Rating" : { "RatingDist" : "1000001103", "Rating" : "6.9", "RatingVotes" : "1365" }, "ReleaseYear" : "2005", "RunningTime" : "15", "SeriesEndYear" : "", "SeriesID" : "\"12 oz. Mouse\" (2005)", "SeriesType" : "S", "Technical" : { "Colors" : [ "Color" ] }, "_id" : "\"12 oz. Mouse\" (2005)"
}
Расшифровка SeriesType:
- F - фильм
- S - сериал
- E - эпизод
Индексы
В предлагаемом дампе нет индексов (только первичный ключ _id), в ходе выполнения заданий они могут понадобиться.
Просмотр существующих индексов в коллекции:
db.collection_name.getIndexes()
Функция просмотра всех индексов для всех коллекций:
db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});
Создание индексов:
db.collection_name.createIndex( { field_name: 1 } )
db.collection_name.createIndex( { field_name: "hashed" } ) // хэш-индексы
Дополнительно
- Подробное описание скрипта и модели данных: https://www.packtpub.com/books/content/mongo-goes-to-the-movies
Язык запросов MongoDB
Базовые операции
Дополнительно
Aggregation Framework
Дополнительно
Репликации MongoDB
Принцип работы репликаций в MongoDB
Конфигурация набора реплик
Сценарий отказа мастер-узла
Стартовый скрипт инициализации сбоя во время работы
Дополнительно
Задания на защиту
1. Составить запросы с агрегацией:
- Для каждого года из первой декады XXI века посчитать количество снятых фильмов.
- Выбрать топ-10 наиболее популярных ключевых слов для фильмов заданной страны.
2. Составить свою формулу рейтинга (общего для всех фильмов или по какому-либо фильтру), используя параметры словарей Movie.Rating (Rating - среднее значение оценкой, RatingVotes - количество оценок) или любые другие.
Для примера вот формула Top 250 IMDb Movies
ранг фильма = (v/(v+k))*X + (k/(v+k))*C где: X = рейтинг фильма v = количество голосов k = минимальное количество голосов, чтобы попасть в список (для данного списка 25000) C = средний рейтинг для всех фильмов в этом списке (для данного списка 6.90)
MongoDB поддерживает многие арифметические операции: https://docs.mongodb.com/manual/reference/operator/aggregation-arithmetic/
Данное задание можно выполнить не одним запросом через агрегацию, а используя функцию на JavaScript, которая выполняется в консоле MongoDB.
3. Написать скрипт на bash или любом другом скриптовом языке, который запускает сервер MongoDB в режиме реплики, начинает интенсивно изменять данные, определяет мастер-узел, убивает процесс мастер-узла, после этого заканчивает изменения данных и проверяет целостность данных.
Защита лабораторной работы
- Показать и выполнить запросы с агрегацией, объяснить структуру запросов
- Продемонстрировать работу скрипта инициализации сбоя во время работы и объяснить, что происходит с репликами MongoDB