Este documento descreve a migração de bases de dados bibliográficas do sistema ISIS para bancos de dados não relacionais, analisando as vantagens do modelo de dados semiestruturado e selecionando o Apache CouchDB como sistema alvo por oferecer replicação distribuída e instalação simples, adequado para bases públicas.
1. Luciano G. S. Ramalho
O Modelo de Dados
Semiestruturado em
Bases Bibliográficas:
do CDS/ISIS ao
Apache CouchDB
Monografia de Graduação
Bacharelado em Biblioteconomia
Orientador: Prof. Dr. Marcos Mucheroni
USP – ECA – CBD
Novembro de 2010
1
1
4. Para Marta,
por tudo.
Agradecimentos:
Colegas da BIREME/OPAS/OMS
Marcos Mucheroni
Imre Simon
Maria Lucia e Jairo
membros da banca
e colegas presentes
4
4
9. Exemplo de uso: ISIS na
catalogação cooperativa
• LILACS: Literatura
Latinoamericana y del
Caribe en Ciencias de
la Salud
• Catalogação
cooperativa de
artigos científicos nos
países de origem
9
9
10. Contexto tecnológico
• Hegemonia do modelo relacional
normalizado (MRN)
• Bancos de dados não relacionais em
alguns nichos (ISIS, Adabas, Mumps...)
• Grandes sites revelam seus segredos
(Google, Amazon, Facebook...)
• Movimento NoSQL = Not only SQL
10
10
11. Alguns produtos NoSQL recentes
• Apache Cassandra Todos lançados
após o ano 2000
• Apache CouchDB
• MongoDB
• Hadoop Hbase
• Hypertable
• Google Datastore
• Redis
• Amazon SimpleDB
• Riak
• Apstrata
• ThruDB
11
11
13. Descrição do problema
de pesquisa
A família de sistemas ISIS mostrouse muito bem
adaptada à operação de bases bibliográficas nos
últimos 25 anos, mas com o passar tempo vieram
dificuldades para evoluir suas implementações.
Com o surgimento de novos sistemas com modelos
de dados mais flexíveis, será que existe hoje um
caminho para a migração de bases ISIS que
evite uma reestruturação dos dados com impacto
sobre as próprias metodologias de catalogação?
13
13
16. Modelo Relacional Normalizado
bd_opac
objeto banco de
banco de livros autores dados
dados
editoras
livros
relação tabela
tupla registro
atributo campo
16
16
17. Modelo Relacional Normalizado
• Pela definição de E. F. Codd, os domínios
dos atributos devem ser atômicos
– Ou seja: valores simples e indivisíveis do ponto
de vista do sistema de banco de dados
• 1ª Forma Normal (1FN ou 1NF, em inglês)
– C. J. Date debate a definição clássica de 1FN
C. J. Date
C. J. Date
××
Codd, Elmasri, Setzer, Silberschatz...
Codd, Elmasri, Setzer, Silberschatz...
17
17
18. O problema do MRN
[...] seria interessante notar o
absurdo do padrão do MRN
[Modelo Relacional
Normalizado]: se um livro
tiver 3 autores e 5 assuntos
[...].
SETZER, V. Bancos de dados: aprenda
o que são, melhore seu conhecimento,
construa os seus. 1ª ed. São Paulo:
Edgard Blücher, 2005, p. 135.
18
18
19. O problema do MRN
Livros
[...] será necessário Assuntos
representá-lo [em] uma linha
na tabela Livros, mais 3 na
Nomes-de-autores [...] e mais
5 na de Assuntos, num total Nomes de Autores
de 9 linhas em três tabelas
distintas [...]
SETZER, V. Bancos de dados: aprenda
o que são, melhore seu conhecimento,
construa os seus. 1ª ed. São Paulo:
Edgard Blücher, 2005, p. 135.
19
19
20. O problema do MRN
[...] Mas o que se vê e
pega-se na mão no mundo
real é um livro só, e não
um picadinho de livro!
SETZER, V. Bancos de dados: aprenda
o que são, melhore seu conhecimento,
construa os seus. 1ª ed. São Paulo:
Edgard Blücher, 2005, p. 135.
20
20
21. O problema do MRN
[…] Veremos que no MRNN
[Modelo Relacional Não-
Normalizado] isso pode ser
representado em uma só linha,
que é o que se esperaria de um
modelo de dados decente [...]
Livros
=
SETZER, V. Bancos de dados: aprenda
o que são, melhore seu conhecimento,
construa os seus. 1ª ed. São Paulo:
Edgard Blücher, 2005, p. 135.
21
21
22. Consequências da 1FN
• No MRN, para representar subcampos ou
campos repetitivos é necessário criar
registros em tabelas adicionais
• A explosão de um registro bibliográfico em
vários registros espalhados por tabelas
complica o fluxo de trabalho distribuído de
uma rede de catalogação cooperativa
como a LILACS
22
22
24. Modelo Semiestruturado
• Formalizado por grupos de pesquisa a
partir de 1995
– UPenn Database Research Group
– Projeto Lore, Stanford University
• Motivação: facilitar o intercâmbio de dados
• Modelo proposto é mais simples que o
modelo de dados do XML
24
24
25. O livro vermelho
• Hellerstein &
Stonebraker
• Coletânea de artigos
• Livrotexto na UC
Berkeley
• Visão histórica e
crítica de modelos
de dados
25
25
27. Semistructured Database Design
• Teoria atualizada
(2004)
• Discussão sobre
redundância,
anomalias de
atualização etc.
• Notação gráfica para
definir esquemas de
dados
27
27
28. Família ISIS
Egbert de Smet
Egbert de Smet
III Congresso Internacional
III Congresso Internacional
de Usuários de CDS/ISIS,
de Usuários de CDS/ISIS,
Rio de Janeiro,
Rio de Janeiro,
set. de 2008
set. de 2008
28
28
29. Documentação sobre ISIS
• Utilitários CISIS
– Manuais produzidos pela BIREME/OPAS/OMS
• ISISNBP
– Wiki e repositório de código público
– Desenvolvimentos recentes:
• Conversor de ISIS para JSON
• ISISDM: API para definição de esquemas de dados
• Schematize: definição automática de esquemas de
dados por inferência a partir de amostras
29
29
30. Exemplo de registro ISIS
10 «Lewis Carroll^y1832-1898^rauthor»
10 «John Tenniel^y1820-1914^rillustrator»
10 «Lewis Carroll^y1914-2010^reditor»
12 «The Annotated Alice^sThe Definitive Edition»
30
30
31. Exemplo de registro ISIS
Campo repetitivo
10 «Lewis Carroll^y1832-1898^rauthor»
10 «John Tenniel^y1820-1914^rillustrator»
10 «Lewis Carroll^y1914-2010^reditor»
12 «The Annotated Alice^sThe Definitive Edition»
31
31
32. Exemplo de registro ISIS
Marcador de sub-campo Sub-campo
10 «Lewis Carroll^y1832-1898^rauthor»
10 «John Tenniel^y1820-1914^rillustrator»
10 «Lewis Carroll^y1914-2010^reditor»
12 «The Annotated Alice^sThe Definitive Edition»
32
32
33. Exemplo de registro ISIS
Campo repetitivo
10 «Lewis Carroll^y1832-1898^rauthor»
10 «John Tenniel^y1820-1914^rillustrator»
10 «Lewis Carroll^y1914-2010^reditor»
12 «The Annotated Alice^sThe Definitive Edition»
Marcador de sub-campo Sub-campo
33
33
34. Metodologia LILACS
• Metodologia
LILACS: Manual
de Descrição
Bibliográfica, 7ª ed.
• Diccionario de
datos del modelo
LILACS Versión
1.6a
34
34
36. SGBDs nãorelacionais
• Grande diversidade de arquiteturas para
finalidades muito diferentes
• Keyvalue stores são um tipo comum
– BerkeleyDB, Redis, Amazon Dynamo
• Document databases implementam
nativamente o modelo semiestruturado
com índices secundários
– CouchDB, MongoDB, Google Datastore
36
36
37. XML e JSON
<?xml version="1.0" encoding="UTF8" ?>
<?xml version="1.0" encoding="UTF8" ?>
<alunos>
<alunos>
Relação dos alunos matriculados:
Relação dos alunos matriculados:
<aluno matricula=”123456”>
<aluno matricula=”123456”>
<nome>Fulano de Tal</nome>
<nome>Fulano de Tal</nome>
<aluno>
<aluno>
<aluno matricula=”123457”>
<aluno matricula=”123457”>
<nome>Sicrano de Tal</nome>
<nome>Sicrano de Tal</nome>
<aluno>
<aluno>
</alunos> {"alunos" : [
{"alunos" : [
</alunos>
{"matricula" : "123456",
{"matricula" : "123456",
"nome” : "Fulano de Tal"},
"nome” : "Fulano de Tal"},
{"matricula" : "123457",
{"matricula" : "123457",
"nome” : "Sicrano de Tal"}]
"nome” : "Sicrano de Tal"}]
}}
37
37
39. Seleção do sistema
de banco de dados
• para bases de atualização distribuída, o
CouchDB oferece replicação e instalação
mais simples
• para bases publicadas de forma
centralizada e com alto tráfego,
MongoDB oferece maior desempenho
• para LILACS, optamos por CouchDB
39
39
48. Ferramenta de conversão
de registros ISIS para JSON
• isis2json.py
• leitura:
– arquivos ISO2709 ou binários ISIS (.mst/.xrf)
• escrita:
– arquivos JSON genéricos ou adaptados para
CouchDB ou MongoDB
– registros ISISJSON tipo 1 ou tipo 4
48
48
49. isis2json.py
luciano@meng$ ./isis2json.py h
luciano@meng$ ./isis2json.py h
usage: isis2json.py [h] [o OUTPUT.json] [c] [m] [f] [q QTY] [s SKIP]
usage: isis2json.py [h] [o OUTPUT.json] [c] [m] [f] [q QTY] [s SKIP]
[i TAG_NUMBER] [u] [t PREFIX] [n]
[i TAG_NUMBER] [u] [t PREFIX] [n]
INPUT.(mst|iso)
INPUT.(mst|iso)
Convert an ISIS .mst or .iso file to a JSON array
Convert an ISIS .mst or .iso file to a JSON array
positional arguments:
positional arguments:
INPUT.(mst|iso) .mst or .iso file to read
INPUT.(mst|iso) .mst or .iso file to read
optional arguments:
optional arguments:
h, help show this help message and exit
h, help show this help message and exit
o OUTPUT.json, out OUTPUT.json
o OUTPUT.json, out OUTPUT.json
the file where the JSON output should be written
the file where the JSON output should be written
(default: write to stdout)
(default: write to stdout)
c, couch output array within a "docs" item in a JSON document
c, couch output array within a "docs" item in a JSON document
for bulk insert to CouchDB via POST to db/_bulk_docs
for bulk insert to CouchDB via POST to db/_bulk_docs
m, mongo output individual records as separate JSON
m, mongo output individual records as separate JSON
dictionaries, one per line for bulk insert to MongoDB
dictionaries, one per line for bulk insert to MongoDB
via mongoimport utility
via mongoimport utility
f, subfields explode each field into a JSON dictionary, with "_" as
f, subfields explode each field into a JSON dictionary, with "_" as
default key, and subfield markers as additional keys
default key, and subfield markers as additional keys
q QTY, qty QTY maximum quantity of records to read (default=ALL)
q QTY, qty QTY maximum quantity of records to read (default=ALL)
s SKIP, skip SKIP records to skip from start of .mst (default=0)
s SKIP, skip SKIP records to skip from start of .mst (default=0)
i TAG_NUMBER, id TAG_NUMBER
i TAG_NUMBER, id TAG_NUMBER
generate an "_id" from the given unique TAG field
generate an "_id" from the given unique TAG field
number for each record
number for each record
u, uuid generate an "_id" with a random UUID for each record
u, uuid generate an "_id" with a random UUID for each record
t PREFIX, tagprefix PREFIX
t PREFIX, tagprefix PREFIX
concatenate prefix to numeric field tags (ex. 99
concatenate prefix to numeric field tags (ex. 99
becomes "v99"
becomes "v99"
n, mfn generate an "_id" from the MFN of each record
n, mfn generate an "_id" from the MFN of each record
(available only for .mst input)
49
(available only for .mst input)
49
50. Carga para o CouchDB
• lilimp
– registros ISISJSON tipo 1
– subcampos concatenados
• lilacs
– registros ISISJSON tipo 4
– subcampos expandidos em dicionários
50
50
58. Resultados
• Levantamento de uma base teórica para
estudar o modelo de dados ISIS
• Identificação de SGBDs compatíveis com
o modelo de dados ISIS
• Catalogação das variantes de ISISJSON
• Ferramentas de conversão e análise
• Identificação de inconsistências na base
LILACS
58
58
63. Conclusão
• Modelo de dados semiestruturado é a
teoria que pode apoiar a análise de bases
ISIS e planejar sua evolução
• É simples migrar dados de bases ISIS
para um SGBD orientado a documentos
• O CouchDB pode aumentar o alcance e a
utilidade dos dados, pela facilidade de
criar WebServices (AJAX = HTTP + JSON)
63
63
64. Limitações da pesquisa
• Tamanho da massa de dados
– LILACS100K x 18 milhões em MEDLINE
• Foco em um único SGBD (CouchDB)
– repetir com MongoDB e outros
• Bibliografia com ênfase em livros e
manuais técnicos
– aprofundar estudo em artigos científicos
64
64
70. Indicações para continuar (2)
• Atualização automática de
registros desnormalizados
• Aplicação da teoria a um
problema prático encontrado
em sistemas da BIREME
e no Google App Engine
Dados duplicados são ruins somente
Dados duplicados são ruins somente
na medida em que o esforço para
na medida em que o esforço para
mantê-los consistentes é oneroso.
mantê-los consistentes é oneroso.
MONASH, C. A. http://bit.ly/fHp2p4
MONASH, C. A. http://bit.ly/fHp2p4
70
70
71. Luciano G. S. Ramalho
O Modelo de Dados
Semiestruturado em
Bases Bibliográficas:
do CDS/ISIS ao
Apache CouchDB
Monografia de Graduação
Bacharelado em Biblioteconomia
Orientador: Prof. Dr. Marcos Mucheroni
USP – ECA – CBD
Novembro de 2010
71
71
76. Acesso a campos e subcampos
>>> book.title
>>> book.title
u'The Annotated Alice^sDefinitive Edition'
u'The Annotated Alice^sDefinitive Edition'
>>> print book.title.s
>>> print book.title.s
Definitive Edition
Definitive Edition
>>> print book.creators[0].y
>>> print book.creators[0].y
1832-1898
1832-1898
>>> for creator in book.creators:
>>> for creator in book.creators:
...
... print '%-12s: %s' %% (creator.r, creator[0])
print '%-12s: %s' (creator.r, creator[0])
Author
Author :: Lewis Carroll
Lewis Carroll
Illustrator :: John Tenniel
Illustrator John Tenniel
Editor
Editor :: Martin Gardner
Martin Gardner
76
76
77. Derivação do esquema a partir
de uma massa de dados
• schematize.py lê uma base em formato
ISISJSON e produz o códigofonte de uma
subclasse de isisdm.CheckedModel
• Baseado em regras, é influenciado por
erros na massa de dados
• Esquema gerado é ponto de partida para
um ajuste de acordo com a metodologia
77
77
80. http://www.libraryjournal.com/article/CA250046.html
•• Roy Tennant
Roy Tennant
– California Digital
– California Digital
Library
Library
– Senior Program
– Senior Program
Officer, Research
Officer, Research
division, OCLC
division, OCLC
80
80
81. Porque o MARC deve morrer
• Modelo de dados, sintaxe e metodologia de
descrição (AACR2) entrelaçados
• Concebido para capturar e gerar cartões de
catálogo bibliográficos impressos
• Estrutura rígida e plana
– como representar o sumário?
• Isolamento tecnológico
– para continuar servindo e inovando,
precisamos acompanhar o estado da arte
81
81