Análise do Banco de Dados Mongo
Por: Elias Flach • 21/5/2021 • Seminário • 2.449 Palavras (10 Páginas) • 105 Visualizações
Disciplina: Sistemas de Bancos de Dados
Entrega Atividade 2020a Etapa 2
Banco de Dados Etapa 1: PostgreSQL (para comparativo)
Banco de Dados Etapa 2: MongoDB
Um pouco sobre o MongoDB:
O mongo DB é um banco de dados não relacional criado pela empresa 10Gen em 2009, na linguagem C++, que é multiplataforma e de código aberto, sendo esse um banco Orientado a Documentos.
Atualmente é o banco não relacional mais famoso, o 4º mais amado pelos programadores e o mais procurado nas plataformas de pesquisa (dados segundo uma pesquisa do StackOverflow)
Modelo ER:
Vamos agora demonstrar o banco do PostgreSQL, e após o banco de dados do MongoDB, para fins comparativos de como ficou a estrutura:
PostgreSQL:
[pic 1]
MongoDB: (versão migrada do PostgreSQL acima)
[pic 2]
Vale destacar:
Cada valor em ‘Movies’ era uma tabela de junção (N para N) que foi “embutida” dentro de ‘Movies’ para facilitar as futuras consultas e demonstrar resultados otimizados.
Para a migração:
A conversão foi feita com um script feito em Python, demonstrado a seguir, que selecionou os dados do PostgreSQL e os passou para o MongoDB.
A estratégia que utilizamos para conversão foi deixar os registros todos diretamente como atributos da então collection ‘Movies’ e os mais complexos (que não eram simples N para N) como outras collections.
Sendo assim, foram eliminadas tabelas (collections) intermediárias como ‘movies_keywords’ e ‘movies_genres’.
Script de migração dos dados:
from pymongo import MongoClient
from pgdb import connect
mongo = MongoClient('localhost', 27017)
pg = connect(host='localhost', port=5433, dbname='the_movies_dataset', user='postgres', password='postgres')
def get_actors():
actors = pg.execute('''
select acto.order_id
, pers.name
, pers.id person_id
, acto.movie_id
, acto.id
from actors acto inner join persons pers
on acto.person_id = pers.id
''').fetchall()
mongo_actors = {}
movie_actors = {}
for actor in actors:
mongo_actors[actor.person_id] = {
'name': actor.name,
'order_id': actor.order_id
}
movie_actors[actor.movie_id] = (movie_actors.get(actor.movie_id) or set())
movie_actors[actor.movie_id].add(actor.person_id)
return movie_actors, mongo_actors
def get_countries():
countries = pg.execute('''
select coun.name
, coun.code
, coun.id country_id
, prco.movie_id
, prco.id
from production_countries prco inner join countries coun
on prco.country_id = coun.id
''').fetchall()
mongo_countries = {}
production_countries = {}
for country in countries:
mongo_countries[country.country_id] = {
'name': country.name,
'code': country.code
}
production_countries[country.movie_id] = (production_countries.get(country.movie_id) or set())
production_countries[country.movie_id].add(country.country_id)
return production_countries, mongo_countries
def get_languages():
languages = pg.execute('''
select lang.lang_key
, lang.name
, lang.id language_id
, spla.movie_id
, spla.id
from spoken_languages spla inner join languages lang
on spla.language_id = lang.id
''').fetchall()
mongo_languages = {}
movie_languages = {}
for language in languages:
movie_languages[language.movie_id] = (movie_languages.get(language.movie_id) or set())
movie_languages[language.movie_id].add(language.language_id)
all_languages = pg.execute('''
select lang.lang_key
, lang.name
, lang.id language_id
from languages lang
''').fetchall()
for language in all_languages:
mongo_languages[language.language_id] = {
'lang_key': language.lang_key,
'name': language.name
}
return movie_languages, mongo_languages
def get_genres():
genres = pg.execute('''
select genr.name
, moge.movie_id
from movies_genres moge inner join genres genr
on moge.genre_id = genr.id
''').fetchall()
movie_genres = {}
for genre in genres:
movie_genres[genre.movie_id] = (movie_genres.get(genre.movie_id) or [])
...