Avatar billede mr_bula Nybegynder
07. december 2008 - 09:19 Der 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.
Avatar billede aaberg Nybegynder
07. december 2008 - 10:35 #1
Jeg ville nok lave en tabel med en XIndex kolonne, en YIndex kolonne og en Value kolonne. Hvis du har et 3x3 array, ville tabellen se sådan ud.

XIndex  YIndex  Value
0          0            -
1          0            -
2          0            -
0          1            -
1          1            -
2          1            -
0          2            -
1          2            -
2          2            -


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!
Avatar billede mr_bula Nybegynder
07. december 2008 - 11:53 #2
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?
Avatar billede mr_bula Nybegynder
07. december 2008 - 11:55 #3
Eller hvad der er hurtigt. At loope en tekstfil, streng, eller tabel igennem
Avatar billede arne_v Ekspert
07. december 2008 - 16:23 #4
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]
Avatar billede mr_bula Nybegynder
08. december 2008 - 08:42 #5
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å :)
Avatar billede aaberg Nybegynder
08. december 2008 - 09:00 #6
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 :-)
Avatar billede arne_v Ekspert
09. december 2008 - 02:50 #7
Svar.

At du skal have et navn ind også synes jeg ikke ændrer på noget. Databaser er gode
til at lave joins, hvis der er de rette index.

Hvis du endelig vil gemme klumpen så brug en binær BLOB og ikke en tekst CLOB.
Avatar billede mr_bula Nybegynder
09. december 2008 - 11:09 #8
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?
Avatar billede arne_v Ekspert
10. december 2008 - 01:38 #9
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester