sql >> Database teknologi >  >> NoSQL >> MongoDB

Lagring af et dybt bibliotekstræ i en database

I betragtning af dine krav til:

  • A) Lavt RAM-forbrug
  • B) Møde filstørrelsesbegrænsninger i Mongo
  • C) En responsiv brugergrænseflade

Jeg vil overveje noget i retning af følgende.

Tag dette eksempel på mappen

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

I JSON kunne det muligvis repræsenteres som:

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

Sidstnævnte, som du påpegede, skalerer ikke godt med store mappestrukturer (jeg kan fortælle dig første hånd, at browsere ikke vil sætte pris på en JSON-blob, der repræsenterer selv en beskeden mappe med et par tusinde filer/mapper). Den førstnævnte, selvom den er beslægtet med nogle faktiske filsystemer og effektiv i den rigtige sammenhæng, er en smerte at arbejde med at konvertere til og fra JSON.

Mit forslag er at opdele hver mappe i et separat JSON-dokument, da dette vil løse alle tre problemer, men intet er gratis, og dette vil øge kodekompleksiteten, antallet af anmodninger pr. session osv.

Ovenstående struktur kan opdeles i følgende dokumenter:

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

Hvor hvert dokument repræsenterer en mappe eller fil og (hvis mappe) dens umiddelbare underordnede ID'er. Underordnede elementer kan lades indlæses ved hjælp af deres id'er og føjes til deres forælder i brugergrænsefladen. Velimplementeret lazy loading kan forhåndsindlæse børneknuder til en ønsket dybde, hvilket skaber en meget responsiv UI. RAM-forbruget er minimalt, da din server kun skal håndtere små nyttelast pr. anmodning. Antallet af anmodninger stiger ganske vist betydeligt i forhold til en enkelt dokumenttilgang, men igen, noget smart doven indlæsning kan gruppere anmodninger og reducere det samlede antal.

OPDATERING 1 :Jeg overså på en eller anden måde dit næstsidste afsnit, inden jeg svarede, så det er nok mere eller mindre det, du havde i tankerne. For at løse problemet med for mange dokumenter kan et eller andet niveau af klyngingsknuder i dokumenter være i orden. Jeg er nødt til at tage afsted nu, men jeg vil overveje det.

OPDATERING 2 :Jeg har lavet en kerne af en forenklet version af klyngekonceptet, jeg nævnte. Det tager ikke hensyn til filer, kun mapper, og det inkluderer ikke og kode til at opdatere dokumenterne. Forhåbentlig vil det give dig nogle ideer, jeg vil fortsætte med at opdatere det til mine egne formål.

Hovedindhold:tree_docs_cluster.js




  1. Spring Data MongoDB:aggregeringsramme - sortering med indlejret egenskab kaster ugyldig reference

  2. MongoDB - DBRef

  3. Sådan sorterer, vælger og forespørger underdokument i mongoose

  4. Skriv stream til mongoDB i Java