07. december 2008 - 09:19Der er
7 kommentarer og 2 løsninger
2 dimensional array i database
Skal gemme et matrix i en database. Det kan blive helt op til 150 x 150. Hvordan gøres det bedst, hurtigst og pænest? Forslag og begrundelser ønskes.
Er selv kommet på 2 muligheder: 1) gemmer det i en tekstfil som så bliver gemt i db'en. 2) gemmer indholdet i en string/text i db'en og så konvertere dataen over til 2 dimensional array når jeg hiver det ud.
Når du hente arrayet op fra databasen, looper du alle rows igennem, og sætter værdien i arrayet med index (XIndex, YIndex) til værdien i Value. Jeg håber det giver mening!
Ok, nu glemte jeg at skrive at jeg skal gemme flere forskellige dobbelt arrays i samme tabel!
En 150x150 matrice vil give 22500 rækker a 4-5 kolonner. Skal have 1-2 ekstra kolonner, da jeg skal have et id med og noget så jeg kan se hvilke rækker der hører sammen.
Ved ikke hvor meget en tekstfil eller en lang text string fylder kontra din løsning?
matrixid,x,y,value er helt fint hvis du vil bruge databasen rigtigt - det giver super hurtig adgang til dele af matricerne (forudsat at der er index på de 3 første felter).
Hvis du altid vil hente og gemme hele matricer og du ikke skal bruge anden database funktionalitet, så kunne du gemme det som matrixid,data hvor data er en BLOB med en binær serialiseret form af data.
En CLOB med kommasepareret tal er der ikke meget pointe i.
100 matricer af 22500 rækker er kun 2.25 millioner rækker - det er ingenting (for korte rækker).
Generelt vil din database administrator ikke bryde sig om BLOB og CLOB.
[Note: BLOB og CLOB hedder IMAGE og TEXT/NTEXT i SQLServer]
Ja kan godt se det er mest database rigtigt, men har fundet ud af at jeg skal bruge et navn til mine matricer, og så skal jeg pludselig til at lave 2 ekstra tabeller for at undgå redundans. Ligeledes skal jeg bruge hele matricen hver gang.
Så jeg har valgt at lave en streng hvor alle værdier bliver smidt i. Når jeg så indlæser strengen smider jeg værdierne ind i mit array. Måske ikke den mest optimale måde, men synes, i forhold til hvad det skal bruges til, at det fungere.
Tak for jeres forslag, smid lige et svar, og I må stadig godt komme med modargumenter for "min" måde at gøre det på :)
Med hensyn til hastighed. Så vil jeg tro at din måde at gøre det på, bliver marginalt hurtigere, når man skal gemme hele arrayet i databasen. Når man derimod skal hente arrayet fra databasen, vil jeg tro at min/arne_v's metode er lidt hurtigere (Givet at du har sat et index på matrixID).
Med hensyn til design og fleksibilitet, er metoden som bruger databasen klart den bedste løsning. Den giver muligheder for fremtiddige opgraderinger og ændringer, uden at du bliver nød til at fikle med en eller anden tekststreng. Hvis dette er en lille privat testapplikation, er dette ligegyldigt, men er det noget du laver som professionel, bør du lave det så fleksibelt som muligt. Ellers kommer den næste udvikler i din stilling til at sidde og bande og svovle over dit arbejde :-)
Ved godt at navnet ikke betyder noget andet end jeg skal lave 2 ekstra create og en join sætning, men under mine omstændigheder er det måske overkill. Jeg ville til hver en tid, hvis det var et større projekt eller noget andre skulle bruge gøre det så database agttig som muligt som I foreslår.
Vil du hellere bruge en BLOB da den er mindre ressourcekrævende end CLOB?
I samme øjeblik du bruger en LOB kan du ikke tilgå data fornuftigt via SQL.
En BLOB fylder mindre og bruger mindre CPU ved nedpakning og udpakning end en CLOB.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.