05 - 05 - 2024
Main Menu
Who's online

We have 210 guests and no members online

Latest articles
Visitors
27104141
Today
Yesterday
This Week
This Month
Last Month
All days
4995
8980
68474
49347
295642
27104141

Old stories

Index is a must

User Rating:  / 1

Jeg lærer stadig noe nytt angående databaser og nå ser jeg virkelig nytten av indekser. En index brukes for å få en raskere behandling av en forespørsel til databasen. La oss tenke oss en rekke med tall som ikke er sortert og som kan forekomme i en hvilken som helst rekkefølge. For å finne et bestemt tall i denne rekken uten å bruke index må databasemotoren søke gjennom alle tallene eller til den kommer til ønsket tall. Dette kan ta tid hvis tabellen har 100 millioner tall. Derfor får man en vesentlig forbedring hvis man oppretter en index for disse tallene. (eller tekstene eller hva det måtte være). Da vil databasemotoren lage en tabell der tallene er sortert og med henvisning til hvor dette tallet finnes i den orginale tabellen. Teknikken som brukes for sortering og oppdatering av denne indexen som blir gjort automatisk av databasemotoren bygger etter hva jeg forstår på binære søketrær. Dette er en utrolig fin teknikk for sortering. Jeg har ikke brukt index på ID til foreldre i AgetoAgeSqlite og derfor fikk jeg ikke så rask responstid som ønskelig i for eksempel "Close relations" (Group View). Derfor har jeg nå lagd et vindu der man kan klikke "Create father, mother index" og en knapp for å fjerne denne indexen om man skulle ha lyst til det. Da jeg testet dette fikk jeg hakeslepp og håret reiste seg flere meter over hodet. Jeg testet med en database med ca 150 000 personer og det var omtrent ikke noe ventetid for å få listet opp etterkommere av en person med 4500 etterkommere. "Close relations" jobber som et lyn når man lager index for ID til foreldre. Det artige er at i prinsippet kan man lage og slette indexer som man vil og indexene vil oppdateres automatisk av databasemotoren. Jeg kunne ha lagd det slik at disse indexene ble lagd automatisk når man oppretter en ny database, men fordelen med å la brukeren lage indexene er at brukeren også da kan slette indexen om dette skulle være ønskelig (f.eks hvis man vil importere 500 000 personer fra en GED fil kan det være noen sekunder å spare ved å slette indexen først. Så kan man bare lage indexen på nytt etter at importen er ferdig) Det er mulig jeg kommer til å lage et vindu er brukeren vil ha full kontroll over hvilke tabeller og felter som man vil ha index på. Brukeren kan da f.eks lage index over Firstname og Lastname osv. og få en superrask behandling av søk på disse. Som nevnt, indexer medfører litt ekstra arbeid for databasemotoren når man oppdaterer data og importerer data så ikke lag indexer i hytt og pine men indexen for ID til foreldre var virkelig nyttig. Men nå som et første skritt er altså muligheten for å indexere ID til foreldre til stede og oppdateringen er lastet opp. GOD FORNØYELSE!

 Ved å velge Indexes kommer man til dette vinduet hvor alle indexer vises. Alle tabeller i AgetoAgeSqlite har en index (noen tabeller har to felter som tilsammen blir én index, f.eks ata_marriages har to felter ID1 og ID2 som er id til de som har giftet seg og tilsammen blir de en unique index). Men brukeren kan altså opprette flere indexer for felter som ikke har noen index. Som nevnt er ikke FatherID og MotherID i persontabellen indexert som standard. Dette er verdier som ikke er unique i tabellen, så man må ikke lage en unique index for disse, mange personer kan ha samme far og mor men resultatet av å lage en IKKE UNIQUE INDEX hadde altså en enorm virkning på hastigheten for å finne personer med en bestemt far eller mor.

Noen vil kanskje tenke nå at nei, huff dette blir for avansert for meg... men fortvil ikke, det vil komme noen knapper man bare klikker for å lage en index man ønsker å ha. (og en knapp for å slette den om den ikke er så interessant lenger). Det morsomme er at programmet ikke trenger å modifiseres for å bruke en index, databasemotoren vil selv velge om den kan bruke index eller ikke når den får en forespørsel. Hvis brukeren har opprettet en index for feltet man søker i så vil databasemotoren automatisk bruke denne hvis spørringen er slik at index kan brukes for å finne resultatet. Disse indexene som brukeren lager vil ikke endre noenting på strukturen i tabellen som indexen berører. Tabellen vil være akkurat som før man laget indexen, det er databasemotoren som håndterer dette, la oss ta et eksempel brukeren lager index på Firstname i persontabellen, databasemotoren vil da lage en egen tabell (helt på egenhånd) og kopiere alle fornavn fra persontabellen til denne nye tabellen med et felt som viser hvor i persontabellen den finner dette navnet. Tabellen vil være sortert på fornavn med binert søketre teknikk. Derfor er det helt trygt å lage og slette indexer så mye man vil. Hvis brukeren endrer noen data i persontabellen som berører indexen vil indexen automatisk bli oppdatert i den nye tabellen. For dem som er interessert kan jeg vise hvordan jeg får databasemotoren til å lage en slik index. Kommandoen jeg sender til databasemotoren for å lage index på firstname er:

"CREATE INDEX firstnameIndex ON ata_persons (firstname)"

for å slette den er det så enkelt som:

"DROP INDEX firstnameindex"

Dette gjelder for SQLIte, for andre systemer kan syntaksen være litt annerledes. Men dette er bare et eksempel på å lage index, i de fleste tilfeller går søket så fort uten bruk av index for firstname at det har ingen hensikt å lage index for firstname. Om det tar 1/4 dels sekund eller 1/1000 dels sekund er vel ikke så viktig når man søker på navn. Det avhenger egentlig av hvor mange forskjellige navn man har i databasen. Har man mindre enn 500 000 forskjellige fornavn i databasen er det kanskje ingen vits å bruke index på bare fornavnet. Men man kan slå sammen flere felter til en index, f.eks "CREATE INDEX nameIndex ON ata_persons (firstname, lastname)".

Konklusjonen er at indexer er et must når programmet gjentar en rekke forespørsler til databasen der man spør på et felt som ikke ble indexert da tabellen ble laget. "Close Relations" er et godt eksempel på hvor viktig det er å bruke index på father- og motherID. Man har en masse forespørsler der på father og motherID. Også "Descendant Tree"  jobber 100 ganger raskere med indexert father- og motherID. Jeg er nesten kommet til den endelige konklusjon at disse feltene skulle vært indexert når brukeren lager en ny database. Jeg kan ganske enkelt bare legge til kommandoen CREATE INDEX fathermotherID ON ata_persons (fatherID, motherID) når brukeren lager en ny database eller jeg har alternativet å definere feltet father- og motheriD som indexert når tabellen ata_persons blir laget. Eller det tredje alternativet å la brukeren selv lage den ved å klikke en knapp. Ved det siste alternativet kan brukeren slette denne indexen og lage den på nytt når behovet oppstår. Hva er best? Noen som har noen tanker om dette?

27.01.2011 - Jeg tror jeg satser på å la programmet utføre CREATE INDEX fathermotherID ON ata_persons (fatherID, motherID) når man lager ny database. Father og motherID peker til PID i den samme tabell så jeg kan ikke bruke en relasjon her (bruk av primary og foreign keys). Indexen vil oppdateres av databasemotoren etterhvert som man legger til personer. Jeg har nå funnet en masse GED filer som jeg har importert og har litt mer enn 200 000 personer i databasen. Artig å se hvor mange som heter det og det og man kan lage statestikk over forskjellige ting med et godt utvalg av tilfeldige personer.

Har også flyttet "Indexes" til "Database Info" vinduet der det også er en ny knapp "Table Structure" der man kan vise tekniske detaljer for hvert felt i alle tabellene som  brukes. Oppdateringen er lastet opp.

28.01.2011 - Lastet opp ny oppdatering av AgetoAgeSqlite som lagrer verdi på "Checked" på personskjemaet. Det er nyttig å kunne merke en person for å finne den hurtig igjen senere. Bare å skrive i SQL feltet i personlisten "where Marked = '1'", samtidig har jeg laget funksjon som gjør at man kan dobbelklikke gjeldende Page nummer i personlisten for å skrive inn nummer på siden man vil gå til.

For å finne GED filer for å teste importen i AgetoAgeSqlite har dette stedet en masse filer http://www.genealogyforum.com/gedcom/

New locations window

User Rating:  / 0

Nytt locations vindu i AgetoAgeSqlite. Oppdateringen er lastet opp.

Jeg har også gått gjennom prosedyren som finner alle ancestorer og lagt inn en variablel som kan avbryte prosedyren når ønsket nivå er nådd i treet på alle grener. Dette gjør at jeg kan programmere det slik at denne prosedyren bare tar de 10 første generasjoner bakover i vinduet som viser ancestor treet. Når man så presser høyre eller venstre piltast for å bevege seg henholdsvis til høyre eller venstre i treet vil de 10 neste nivåer bakover vises. Dette gjør igjen at vinduet er meget kjapt å jobbe i uansett hvor mange ledd bakover dette går. Jeg testet dette med en GED fil som jeg mporterte og som har 120 generasjoner og det var ingen problemer å merke. Man kan sette ønsket Max nivå både for ancestorer og descendanter i menyen Options.

Personlisten har også blitt oppdatert litt. Til venstre for SQL boksen er det en UPDOWN knapp så man kan klikke for å velge noen SELECT setninger man har brukt tidligere. I denne listen blir det nå ved oppstart av programmet lagt inn noen standard setninger.

Import av GED filer

User Rating:  / 0

GED filer kan være en artig ressurs å arbeide med. Men selvfølgelig kan man ikke stole på at dataene i en GED fil er riktige, men brukt som et hjelpemiddel til å komme videre i sitt arbeid kan de være interessante. Jeg har importert en masse GED filer til  en testdatabase jeg opprettet med AgetoAgeSqlite og har nå ca 301 000 personer og ca 112 000 familier i den. Grunnen til all denne importen er selvfølgelig å finne feil og mangler i programmet, men det slår meg at det er jo egentlig fantastisk å kunne jobbe med sine egne data (jeg har selvfølgelig importert min egen GED fil med våre slektsdataer) samtidig som man har en masse ukjente personer og forbindelser i databasen. På grunn av indexen over far og mor IDer kan programmet liste ut etterkommere og ancestorer til mine forfedre uten at det går noe merkbart saktere selv om jeg nå har over 300 000 personer i databasen. Alle GED filer som blir importert får automatisk lagt til en KILDE der dato, navn på ged-fil, hvilket program GED-filen opprinnelig ble laget i, hva personen som lagde denne GED-filen het og dennes email addresse kommer også med i KILDEN. Videre kan man klikke fanen Personer og Familer for å se hvilke data som ble importert fra denne GED-filen. På denne måten har man en god oversikt over hva man har importert og dermed er det ikke så betenkelig å importere ukjente GED-filer. Bare ta en backup av databasen først i tilfelle noe går galt. Jeg har sett noen eksempler på GED filer som ikke er brukbare teknisk sett, men jeg er overrasket over å kunne importere den ene etter den andre totalt ukjente GED-fil til databasen uten problem. Man kommer av og til over noen artige GED-filer, f.eks fant jeg en GED-fil med ca 100 000 personer der forfedrene går 3000 år tilbake fra Kristus fødsel. Å browse denne gedfilen med Ancetor Treet var en opplevelse i seg selv. Her åpnet det seg veier tilbake i tiden som selv den mest beleste professor i historie kunne bli blek av og en masse kommentarer på personene var også med. Med andre ord en masse kjente navn fra historien pluss, pluss, pluss. Og i dag fant jeg en GED-fil med en masse kongelige personer fra England, Spania og Frankrike, Selv om man ikke har noen forbindelser man vet om til disse kan det jo være morro å ha dem med i databasen likevel.

 

04-02-2011 - Lastet opp ny versjon av AgetoAgeSqlite der jeg har fått til en raskere behandling i person og familie skjemaene.

Transaksjoner

User Rating:  / 0

Har lastet opp ny versjon av AgetoAgeSqlite der listen over steder har blitt oppdatert slik at den reagerer på valgene man gjør uten å måtte presse ENTER i søketekstfeltene. En annen ting jeg vil nevne for dem som er interessert er bruken av Transaksjoner ved henting/redigering av databasen. Når man sender en forespørsel til databasen vil databasemotoren sette opp forskjellig ting for å kunne sette databasen tilbake til utganspunktet før man gjorde eventuelle endringer av databasen. Bruker man ikke transakjon vil databasemotoren automatisk sette opp en transaksjon men dette vil den gjøre for hver gang man sender en oppdatering eller annen spørring til databasemotoren så har man mange spørringer er det lurt å deklarere en transaksjon dermed vil databasemotoren bare lage èn transaksjon og ikke for hver spørring man sender. Hvis oppdateringen var vellykket uten problemer har transaksjonen en metode man kaller for å godkjenne denne og endringer blir utført. Dette sparer mer tid enn jeg trodde. Jeg brukte ikke transaksjoner i begynnelsen men nå bruker jeg nesten alltid å lage en transaksjon hvis programmet skal sende flere en èn sprørring til databasen. Grunnen til denne tidsbesparelsen er selvfølgelig at det er en masse ting som skal settes opp for å kunne resette databasen hvis en operasjon ikke lyktes. Så alle programmere av databaser: Bruk transaksjonersmiley

Audio in AgetoAgeSqlite

User Rating:  / 0

AgetoAgeSqlite er oppdatert med mulighet for å legge inn lydinnspillinger på personer, det vil selvfølgelig bli mulig også for familier og andre f.eks steder senere. Det er slett ikke så enkelt å programmere dette da man må kjenne til hvordan en WAV fil er oppbygd (struktur). Men jeg søkte litt på nettet og fant kode for dette som var laget av en ingeniør i data. Når man klikker Record vil den enheten som er satt som standard i Windows bli brukt til å lage en lydfil som blir lagret binært i databasen når man klikker OK. Denne innspillingen vil så være bundet til den personen man redigerte. For å høre på opptaket for en person dobbelklikker man bare på aktuell innspilling i listen Media på person skjemaet. Da vil programmet hente den opp fra databasen og spille den. Dette går meget raskt og var artig å teste ut.

Det kan sikkert være nyttig å kunne sitte med et headset eller ha en mikrofon for hånden og bare legge på noen lydkommentarer på personer man arbeider med.

20.02.2011 kl 21.50 - Lastet opp ny versjon der man også kan legge til Audio for familer og steder. Man kan nå også vise alle Audios fra menyen Views. Jeg har også fikset resizingen av scrollbaren i Descendant Tree.

 

24-02-2011 - Lastet opp ny versjon med oppdatert Descendant Tree som gir flere valg og innstillinger.