sql >> Databáze >  >> NoSQL >> MongoDB

Uložení hlubokého adresářového stromu v databázi

Vzhledem k vašim požadavkům na:

  • A) Nízké využití paměti RAM
  • B) Splnění omezení velikosti souboru v Mongo
  • C) Responzivní uživatelské rozhraní

Zvažoval bych něco v následujícím smyslu.

Vezměte si tento příklad adresáře

C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js

V JSON by to mohlo být reprezentováno jako:

{
    "C:": {
        "X": {
            "B": {},
            "file.txt": "file information..."
        },
        "Y": {
            "file.pdf": "file information...",
            "R": {
                "file.js": "file information..."
            }
        }
    }
}

Ten, jak jste zdůraznil, se špatně škáluje s velkými adresářovými strukturami (z první ruky vám mohu říci, že prohlížeče neocení blob JSON představující i skromný adresář s několika tisíci soubory/složkami). První jmenovaný, i když je podobný některým skutečným souborovým systémům a je účinný ve správném kontextu, je obtížné pracovat s převodem do az JSON.

Můj návrh je rozdělit každý adresář do samostatného dokumentu JSON, protože to vyřeší všechny tři problémy, ale nic není zadarmo a zvýší se tím složitost kódu, počet požadavků na relaci atd.

Výše uvedená struktura by mohla být rozdělena do následujících dokumentů:

[
    {
        "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"
    }
]

Kde každý dokument představuje adresář nebo soubor a (pokud je adresář) jeho bezprostřední podřízená ID. Podřízené položky mohou být líně načteny pomocí jejich ID a připojeny k jejich nadřazenému rozhraní v uživatelském rozhraní. Dobře implementované líné načítání může předběžně načíst podřízené uzly do požadované hloubky a vytvořit tak velmi citlivé uživatelské rozhraní. Využití RAM je minimální, protože váš server musí zvládnout pouze malé užitečné zatížení na požadavek. Počet požadavků se oproti přístupu s jedním dokumentem značně zvyšuje, ale opět, některé chytré líné načítání může shlukovat požadavky a snížit celkový počet.

AKTUALIZACE 1 :Nějak jsem před odpovědí přehlédl tvůj předposlední odstavec, takže tohle je asi víceméně to, co jsi měl na mysli. K vyřešení problému s příliš mnoha dokumenty může být v pořádku určitá úroveň uzlů shlukování v dokumentech. Musím teď vyrazit, ale trochu si to rozmyslím.

AKTUALIZACE 2 :Vytvořil jsem podstatu zjednodušené verze konceptu shlukování, který jsem zmínil. Nebere v úvahu soubory, pouze složky, a nezahrnuje a kód pro aktualizaci dokumentů. Doufám, že vám to dá nějaké nápady, budu to nadále aktualizovat pro své vlastní účely.

Podstata:tree_docs_cluster.js




  1. Výjimka časového limitu soketu v Mongo

  2. Aplikace Node / Express se nemůže připojit k docker mongodb

  3. Jak vytvořit dotaz s nebo podmínkou v mongoidu

  4. Mongoose:přiřaďte pole typu 'array of Strings'