Como você projeta um esquema de itens de forma eficiente consulta aninhada em um banco de dados de valor-chave?

StackOverflow https://stackoverflow.com/questions/607746

Pergunta

Eu estou usando Mnesia com Erlang, mas esta questão se aplica a qualquer db de valores-chave como couchdb, etc.

Eu estou tentando se libertar das RDBMS processo de pensamento, mas não posso envolver minha cabeça em torno de como implementar de forma eficiente este tipo de esquema.

Say I tem um registro de usuário, e ele tem muitos registros SubItemA, que tem muitos registros SubItem B, assim:

User
-SubItem A
--SubItem B
...

Eu preciso executar consultas em SubItem B. É eficiente de fazê-lo quando é este aninhados? Devo apenas normalizá-lo por isso vai ser mais rápido?

Já ouvi de algumas pessoas que usam a duplicação de dados para que os dados é tanto aninhada e separada, esta é ridículo ou é realmente útil no presente alguns casos?

Foi útil?

Solução

A questão subjacente é, quando é o desempenho bom o suficiente ?

Table-digitalizar o Dicionário do usuário não é sobrecarga excessiva se você realmente necessidade de examinar cada SubItem B em detalhe e do tamanho da domina o B o tamanho total do dicionário.

Se isso não é bom o suficiente, normalizá-lo para que você possa evitar a leitura de todos os dados do usuário e de SubItem A na frente quando você está consultando SubItem B. Use uma chave composta, como (UserId, SubItemAId, SubItemBId) em o dicionário SubItem B se a tabela é ordenada de modo que você pode fazer consultas alcance.

Se isso mata totalmente a sua usuário / SubItem Um desempenho da consulta, em seguida, considerar a duplicação de dados como um último recurso, porque é mais propenso a erros.

Outras dicas

Em CouchDB seria trivial para emitir entradas vista para cada um dos subitens. Isto lhe daria acesso muito rápido a esses itens. Dependendo do que você também colocar nas entradas de vista você provavelmente poderia fornecer qualquer informação que você precisa para ligar de volta para documentos de pais / sub-itens.

Eu não tenho certeza sobre Mnesia, e eu estou apenas começando com o CouchDB, mas o meu entendimento é que no CouchDB, desde que você gerar seus próprios índices personalizados ( "views"), você pode diretamente criar um índice em esses sub-itens.

Uma função de exemplo mapa:

function(doc) {
    for(var i in doc.subitems_a) {
        var subitem_a = doc.subitems_a[i];

        for(var j in doc.subitems_a[item_a].subitems_b) {
            var subitem_b = subitem_a.subitems_b[j];

            emit(subitem_b, doc)
        }
    }
}

Isso é efetivamente uma indexados lista de SubItem Bs e, em seguida, você poderia cortar e tala de que listando como você escolher.

Na verdade, depende do banco de dados que você está usando eu acho. Em CouchDB uma coisa vai funcionar melhor, enquanto na Mnesia outra coisa seria melhor. Se você particionar e caco os dados? Em que critérios você deve fazê-lo? Quanto a duplicação de dados é suficiente?

Como Jeffery Hantin disse que vai levar alguma experimentação e análise para descobrir a solução certa. Que disse que a maioria dos bancos de dados não relacionais lá fora lhe fornecer as ferramentas necessárias para resolver o problema. Sua parte é descobrir as vantagens e desvantagens de cada um e que trade-off você pode aceitar contra os outros.

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