Store filer i databasen

For tiden er jeg opptatt med å løse noen problemer vi har i produktet vårt relatert til dokumenthåndtering. Vi lagrer dokumentene som blobber i databasen, og de siste dagene har jeg kommet over flere eksempler på hvor lett det er å gjøre ting feil i slike senarier.

WTF 1:

For å håndtere store filer er vi nødt til å splitte dem opp – vi kan ikke behandle de komplette filene i minne. Før vi splitter opp ønsker vi å finne størrelsen på filen. Og hva gjør vi da? Jo, vi laster hele filen i minne og sjekker lengden!

Det verste er at filstørrelsen allerede finnes lagret i et eget felt i basen, men av en eller annen grunn stoler vi ikke helt på denne, og velger å gjøre det på den kostbare måten som får serveren til å knele for store filer.

WTF 2:

Et annet, morsomt eksempel vi kom over i går var koden for å slettemarkere en fil. Alt som skal gjøres er å flippe en bit fra true til false (eller var det muligens motsatt?). Men for å gjøre det laster vi først hele raden fra databasen, som desverre også inkluderer fil-blobben. Så hvis noen for eksempel vil slettemarkere en fil på 100MB, så leser vi først 100MB fra databasen før vi endrer vår bit fra 1 til 0 og oppdaterer.

Nå må ingen føle seg støtt av disse historiene. Alle kan gjøre slike ting fra tid til annen – de fleste, om ikke alle, gjør slike ting fra tid til annen. Men i et stort prosjekt i stadig utvikling er det viktig å sette av tid til å fange opp og jobbe med problemer som disse – spesielt når det dreier seg om produktets absolutte kjernefunksjonalitet.

Jeg garanterer en stor forbedring i neste patch!

Kategorier: Jobb, O/RM & databaser, WTF.
RSS feed for kommentarene. Tilbaketråkk.

3 kommentarer til “Store filer i databasen”

  1. Tormod Haugen Says:

    Det som også er viktig å huske på når en kommer over slikt – er at kanskje det ikke var en problemstilling i utgangspunktet.

    Og om en senere oppdager slikt i egen kode/skjemmes når andre oppdager det – så betyr det jo at en har utviklet seg i mellomtiden :)

  2. Torbjørn Says:

    >det ikke var en problemstilling i utgangspunktet

    Problemet er at kravene til løsningen bare øker og øker, og at man da i stedet for å revurdere designet bare lapper og teiper på raske løsninger. Til slutt sitter man med et monster av en løsning som ingen vet hvordan virker :)

    WTF nr. 2 var forøvrig ikke helt riktig – sitasjonen var faktisk enda værre. Det som skulle gjøres var mer eller mindre en DELETE FROM, men raden – som inneholdt blobben – ble lastet først. Og ikke bare en gang, men en gang for hver gang filen hadde blitt revidert (nøyaktig samme filen).

    Men refakturering er faktisk veldig gøy, selv på kode som dette..

  3. Steve Celius Says:

    Kjempebra at du “tør” å skrive om slike ting. Jeg leser det overhodet ikke som kritikk av den som har gjort det, for vi har alle sammen gjort slike ting, og som Tormod også sier, det funka da det ble laget.

    Det er slike ting man lærer godt av, og spesielt at alt endrer seg over tid og med data.

    Fortsett med slike – det er moro å lese – og lærerikt.

Skriv en kommentar

Tillatte tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Einar W. Høst: Det er jo læringen som gjør det morsomt! Se også http://norvig.com/21-days...

Pagliacci: OBS! tl;wr. Det er vel akuratt det jeg sliter med med min læring innenfor pr...

Torbjørn: La oss anta to ulike definisjoner av Template Method pattern - de to ytterpunkte...

Lars-Petter: Hei igjen. Siden du inviterer til å ta diskusjonen i bloggen, og har tatt deg t...

Torbjørn: Lars-Petter: Det er én måte å se det på. Det er absolutt fortsatt Template M...

Lars-Petter: Hei. Har du ikke i prinsippet her gått over fra Template Method (arv) til Strat...

Christian Abildsø: I alle fall i C#, så føles dette som kode som blir mer fleksibel men vanskelig...

Torbjørn: Hei Henrik, og takk for tilbudet. Ble oppmerksom på Rasberry Pi for under en uk...

Henrik Sandaker Palm: Ang. større hobby prosjekt. Du er som er en slik rakker på programmering har j...

Øivind Nilsen: Slutt å bruke mobilnummeret mitt som eksempel !...

Mulig relaterte linker

 Hold deg oppdatert

Søk i bloggen

Ferske innlegg

  • En historie om programmering
  • Template Method del 4: Multippel arv
  • Template Method Intermesso
  • Template Method del 3: Bare funksjoner
  • Kategorier

  • .net ninja (37)
  • Bøker (17)
  • Diverse prosjekter (35)
  • DSL (10)
  • Erlang (10)
  • F# (5)
  • Hardware (1)
  • Jobb (77)
  • Julekalender (51)
  • kjempekjekt.com (23)
  • LISP/Clojure (33)
  • NNUG / community (60)
  • O/RM & databaser (10)
  • Off topic (116)
  • OO-design/clean code (30)
  • Podcasts (14)
  • Polyglot (77)
  • Ruby (27)
  • Silverlight / RIA (3)
  • Software/verktøy (20)
  • Softwareutvikling (21)
  • Testing / TDD (30)
  • the contiki strip (13)
  • User experience (3)
  • WCF (3)
  • Webutvikling (32)
  • WPF (9)
  • WTF (12)
  • Last ned Wallpaper

    Programmeringsbloggens tøffe skrivebordsbakgrunn med snippets fra ulike språk laster du ned her!

    Abonner via epost

    Om du vil kan du få alle nye blogposter tilsendt til din epost. Abonner nå, det er kjempeenkelt!

    Meta