MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Armazenando uma árvore de diretórios profunda em um banco de dados


Atendendo às suas necessidades de:
  • A) Baixo uso de RAM
  • B) Atendendo às limitações de tamanho de arquivo no Mongo
  • C) Uma IU responsiva

Eu consideraria algo ao longo das linhas do seguinte.

Pegue este diretório de exemplo
C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js

Em JSON, poderia ser representado como:
{
    "C:": {
        "X": {
            "B": {},
            "file.txt": "file information..."
        },
        "Y": {
            "file.pdf": "file information...",
            "R": {
                "file.js": "file information..."
            }
        }
    }
}

O último, como você apontou, não se adapta bem a grandes estruturas de diretório (posso dizer em primeira mão que os navegadores não apreciarão um blob JSON representando mesmo um diretório modesto com alguns milhares de arquivos/pastas). O primeiro, embora semelhante a alguns sistemas de arquivos reais e eficiente no contexto certo, é difícil de trabalhar com a conversão de e para JSON.

Minha proposta é dividir cada diretório em um documento JSON separado, pois isso abordará todos os três problemas, porém nada é gratuito, e isso aumentará a complexidade do código, número de solicitações por sessão etc.

A estrutura acima pode ser dividida nos seguintes documentos:
[
    {
        "id": "00000000-0000-0000-0000-000000000000",
        "type": "d",
        "name": "C:",
        "children": [
            "11111111-1111-1111-1111-111111111111",
            "22222222-2222-2222-2222-222222222222"
        ]
    },
    {
        "id": "11111111-1111-1111-1111-111111111111",
        "type": "d",
        "name": "X",
        "children": [
            "33333333-3333-3333-3333-333333333333",
            "55555555-5555-5555-5555-555555555555"
        ]
    },
    {
        "id": "22222222-2222-2222-2222-222222222222",
        "type": "d",
        "name": "Y",
        "children": [
            "44444444-4444-4444-4444-444444444444",
            "66666666-6666-6666-6666-666666666666"
        ]
    },
    {
        "id": "33333333-3333-3333-3333-333333333333",
        "type": "d",
        "name": "B",
        "children": []
    },
    {
        "id": "44444444-4444-4444-4444-444444444444",
        "type": "d",
        "name": "R",
        "children": [
            "77777777-7777-7777-7777-777777777777"
        ]
    },
    {
        "id": "55555555-5555-5555-5555-555555555555",
        "type": "f",
        "name": "file.txt",
        "size": "1024"
    },
    {
        "id": "66666666-6666-6666-6666-666666666666",
        "type": "f",
        "name": "file.pdf",
        "size": "2048"
    },
    {
        "id": "77777777-7777-7777-7777-777777777777",
        "type": "f",
        "name": "file.js",
        "size": "2048"
    }
]

Onde cada documento representa um diretório ou arquivo e (se diretório) seus IDs filhos imediatos. Os itens filho podem ser carregados lentamente usando seus IDs e anexados ao pai na interface do usuário. O carregamento lento bem implementado pode pré-carregar nós filhos em uma profundidade desejada, criando uma interface do usuário muito responsiva. O uso de RAM é mínimo, pois seu servidor só precisa lidar com pequenas cargas úteis por solicitação. O número de solicitações aumenta consideravelmente em relação a uma abordagem de documento único, mas, novamente, alguns carregamentos lentos inteligentes podem agrupar solicitações e reduzir o número total.

ATUALIZAÇÃO 1 :de alguma forma eu esqueci seu segundo último parágrafo antes de responder, então isso é provavelmente mais ou menos o que você tinha em mente. Para resolver o problema de muitos documentos, algum nível de agrupamento de nós dentro dos documentos pode ser necessário. Eu tenho que ir agora, mas vou pensar um pouco.

ATUALIZAÇÃO 2 :criei uma essência de uma versão simplificada do conceito de clustering que mencionei. Não leva em conta arquivos, apenas pastas, e não inclui código para atualizar os documentos. Espero que lhe dê algumas ideias, continuarei a atualizá-lo para meus próprios propósitos.

Resumo:tree_docs_cluster.js