Базы данных/Лабораторная работа 5 — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(Импорт данных)
(Моделирование данных в MongoDB)
Строка 51: Строка 51:
  
 
== Моделирование данных в MongoDB ==
 
== Моделирование данных в MongoDB ==
Для импорта IMDb в 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 - эпизод
  
 
=== Индексы ===
 
=== Индексы ===

Версия 03:02, 4 июня 2016

Задачи лабораторной работы:

  • Установить MongoDB
  • Рассмотреть различия в моделировании данных для реляционных БД и документоориентированных.
  • Попрактиковаться в составлении запросов к MongoDB: добавление, обновление, селекция, фильтрация, агрегация.
  • Настроить репликацию данных, инициировать отключение мастер-узла в процессе интенсивного обновления данных, проанализировать действия сервера и проверить целостность измененных данных.

Установка MongoDB

Для лабораторных работ достаточно версии 2.4+

Импорт данных

Коллекции, содержащие фильмы и длинные текстовые факты о фильмах:

Для импорта коллекций в базу 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:

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 - эпизод

Индексы

В предлагаемом дампе нет индексов (только первичный ключ _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" } )  // хэш-индексы


Дополнительно

Язык запросов 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