Este esquema parece mais adequado para um armazenamento de dados orientado a documentos ou relacional?
-
22-09-2019 - |
Pergunta
Isenção de responsabilidade:deixe-me saber se esta pergunta é mais adequada para serverfault.com
Quero armazenar informações sobre música, especificamente:
- gêneros
- artistas
- álbuns
- músicas
Essas informações serão usadas em uma aplicação web, e quero que as pessoas possam ver todas as músicas associadas a um álbum, e álbuns associados a um artista, e artistas associados a um gênero.
Atualmente estou usando MySQL, mas antes de tomar a decisão de mudar, quero saber:
- Quão fácil é dimensionar horizontalmente?
- É mais fácil gerenciar do que uma solução baseada em SQL?
- Os dados acima que desejo armazenar seriam muito difíceis de serem obtidos sem esquema?
- Quando penso em associação, penso imediatamente em RDBMSs;os dados podem ser armazenados em algo como o CouchDB, mas ainda ter algum tipo de associação conforme declarado acima?
- Meu aplicativo da web requer replicação. Quão bem o CouchDB ou outros lidam com isso?
Solução
Este tipo de informação é ideal para documentar bancos de dados.Tal como acontece com muitos dados do mundo real, eles não são inerentemente relacionais, portanto, incorporá-los em um esquema relacional trará dores de cabeça no futuro (mesmo usando um ORM - falo por experiência própria).O Ubuntu já usa o CouchDB para armazenar metadados de música, entre outras coisas, em seus Um produto.
Respondendo ao restante de suas perguntas uma por uma:
- A escala horizontal é CAMINHO mais fácil do que com RDBMS.Esta é uma das muitas razões pelas quais grandes sites como Facebook, Digg e LinkedIn estão usando, ou investigando ativamente, bancos de dados sem esquema.Por exemplo, a fragmentação (dividir seus dados em diferentes nós de um sistema) funciona perfeitamente graças a um conceito chamado Consistência eventual;ou seja, os dados podem ser inconsistentes entre os nós por um tempo, mas eventualmente serão resolvidos para um estado consistente.
- Depende do que você quer dizer com "gerenciar"...A instalação geralmente é rápida e fácil de concluir.Não há contas de usuário para configurar e proteger (isso geralmente é feito na camada de lógica de negócios do aplicativo).Trabalhar com um banco de dados de documentos em tempo real pode ser interessante:não há consultas ad hoc no CouchDB, por exemplo;você precisa usar a UI do Futon ou se comunicar com ela por meio de solicitações HTTP.O MongoDB, entretanto, oferece suporte a consultas ad hoc.
- Eu não deveria pensar assim.A resposta de Bastien fornece um bom exemplo de documento JSON serializando alguns dados.A beleza dos bancos de dados sem esquema é que os campos podem estar faltando em um documento e estar presentes em outro, ou os documentos podem ser completamente diferentes uns dos outros.Isso elimina muitos dos problemas envolvidos com RDBMS'
null
valor, que são muitos e variados. - Sim;as associações são armazenadas como documentos aninhados, que são analisados em seu aplicativo como referências de objetos, coleções, etc.Na resposta de Bastien, a chave “músicas” identifica uma série de documentos musicais.
- Isso é muito semelhante à sua primeira pergunta sobre escalonamento horizontal (escalonamento horizontal e replicação estão interligados).Como afirma a postagem do blog CouchIO que Bastien mencionou, "A replicação… foi incorporada ao CouchDB desde o início".Meu entendimento é que todos os bancos de dados de documentos lidam bem com a replicação e fazem isso com mais facilidade do que configurá-los em um RDBMS.
Se você decidir armazenar o arquivo da música junto com os metadados, você também poderá fazer isso no CouchDB, fornecendo o arquivo da música como um anexo ao documento;além disso, você não teria nenhuma inconsistência de esquema como resultado disso, porque não há esquema!
Espero não ter cometido muitos erros aqui;Eu sou muito novo em documentar bancos de dados.
Outras dicas
Seus dados parecem ideais para bancos de dados orientados a documentos.
Exemplo de documento:
{
"type":"Album",
"artist":"ArtistName",
"album_name":"AlbumName",
"songs" : [
{"title":"SongTitle","duration":4.5}
],
"genres":["rock","indie"]
}
E a replicação é um dos recursos mais legais do CouchDB ( http://blog.couch.io/post/468392274/whats-new-in-apache-couchdb-0-11-part-three-new )
Você também pode querer dar uma olhada em Riak.