Pergunta

Boa notícia! Desde a versão 4.8 BerkeleyDB tem interface c #. BerkeleyDB é uma coisa bastante interessante para mim devido à sua natureza não-SQL. Eu sei que é uma excelente ferramenta se alguém quiser armazenar uma grande quantidade de pares de chave / valor. E eu sei sobre tabelas 'acopláveis'. O que eu não sei é como armazenar dados hierárquicos com BerkeleyDB. É adequado para este em geral?

O que eu quero fazer? Eu quero armazenar dmoz.org dados. Agora eu tenho todos os rdfs thous importados para MySQL db. Mas eu não preciso de procedimentos armazenados ou mais características complexas. Eu quero usar BerkeleyDB como armazenamento de dados para o meu leitor de RSS online. Portanto, não há alimentos em uma árvore categoria (como eu disse categorias i já importados de dmoz e eu tenho um monte deles, bem como feeds -. Milhões). E ... eu esqueci sobre itens de alimentação. i deseja armazená-los também com BerkleyDB :-).

olhar é como se eu ter que implementar todas as relações manualmente ,,, É ok ... Mas a coisa mais importante que eu perguntando sobre é a velocidade. Vai (CAN) a minha solução com BerkeleyDB ser mais rápido, em seguida, um baseado em MySQL (ou em qualquer RDBMS em geral)?

Foi útil?

Solução

É apropriado para isso, mas pode ser mais trabalho do que você está disposto a colocar no. BerkeleyDB é uma loja muito geral chave / valor, então tudo que você fazer é dizer "para a chave X, armazenar o valor Y". Mais tarde você pode dizer "me dar o valor de chave de X" e ele vai lhe dar de volta Y. Isso é realmente tudo o que faz a partir de um nível elevado. Ele tem características muito robustas para garantir propriedades de confiabilidade importantes (chamado de ácido, para atomicidade, consistência, isolamento e durabilidade), e tem grande desempenho, mas do ponto de vista do programador, é uma estrutura simples mapa.

Então, sim, você pode armazenar árvores, mas você precisa decidir sobre uma representação bom para eles. Você pode ir para chaves inteiras (se certificar que estão armazenados na ordem de bytes big-endian porque BDB usa ordenação lexicográfica sobre teclas) e simplesmente ter uma estrutura como o valor que contém uma lista de números inteiros para as crianças. Você ainda teria que escrever todos os seus algoritmos de passagem com a mão, apesar de tudo. Sem saber quais os requisitos que você tem para seus dados hierárquicos, porém, é difícil dar uma sugestão mais concreta.

Speedwise, pelo que não Berkeley DB provavelmente não pode obter muito mais rápido (ou seja, você não vai encontrar muito lá fora, que é mais rápido, especialmente se você está disposto a sacrificar algumas das propriedades ACID). Dá-lhe o controle quase completo sobre sua interface com o mapa, portanto, em teoria você poderia provavelmente construir uma estrutura altamente otimizado para o seu caso de uso particular. No entanto, dada a interface de baixo nível, se você está implementando junta, consultas de filtro complexos, ou qualquer tipo de linguagem de consulta não trivial em cima dela, você vai ter que escrever um código muito rápida e algoritmos para manter-se com o grande bancos de dados relacionais lá fora.

Se os seus dados podem ser modelados por XML (eugh, mas eu sei que algumas pessoas gostam dele), há um banco de dados existente construída em cima de BDB chamado XML BDB (também por Sleepycat, agora parte da Oracle). Isso permite que você armazenar documentos XML arbitrários no banco de dados, e para executar XPath rápido e consultas XQuery no banco de dados. Eu não acho que há uma .NET API oficial para isso ainda, mas eu tenho certeza que eu vim através de uma ligação a ela .NET não oficial.

Em geral, a menos que você tem alguns requisitos muito específicos que as soluções existentes lá fora, não permitem que (este não parece ser o caso com o seu cenário), eu aconselho rolando o seu próprio banco de dados (mesmo construído em cima de BDB) a menos que você está muito hábil com algoritmos eficientes e otimização de código. Se você está armazenando triplos RDF, existem bancos de dados dedicados para isso, e até mesmo bancos de dados relacionais não são particularmente inadequados para eles. BDB XML ainda é uma solução viável para isso, também. É, em última análise a sua escolha, mas se eu fosse você eu optar por trabalhar sobre os problemas mais interessantes, sem ter que lidar com operações de banco de dados de baixo nível (e que, portanto, usar uma camada fina sobre pacote existente para minha loja RDF real).

Outras dicas

As estruturas hierárquicas podem ser armazenados em lojas de key-value usando um pai ou filho atributo.

Se você quer um pai para ter 1 ou mais crianças, use um atributo pai em cada registro e ter nós raiz tem um pai de ID 0 ou algum outro valor significativo.

Se você quer uma criança a ter 1 ou mais pais, use um atributo criança em cada registro.

Se você quiser nós pode ter vários pais e as crianças usam uma tabela separada para armazenar os relacionamentos.

Desta forma, você pode percorrer a árvore por consultando para nós que têm uma certa pai ou filho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top