Aug 222010
 

Flattr this!

Jag håller nu på och bearbeta en egen databas som jag länge har väntat med. Hittills har jag använt Calc till uppgiften men känner att nu går det inte längre. Det är jobbigt att sortera och göra sökningar och sorterar man på felaktigt sätt och inte får med alla inblandade kolumner så är databasen förstörd.

Min Calc-tabell är baserad på släktforskning och då ett bouppteckningsregister. Det handlar med annat ord om inventarier som den avlidna har lämnat efter sig. Detta görs för nästan alla döda människor i Sverige. Nu för tiden är det mer sällan det händer. Fördelen ur släktforskningssyfte är att man både får reda på när personen i fråga har dött och dessutom vem makan/maken samt barnen är och var dom bor. Har i nuläget 3600 poster som ska föras över till Base. Åren det gäller är från 1748 och framåt, främst i Öckerö socken som är en samling öar utanför Bohuslän. Calc-tabellen är ett register till bouppteckningar som är skrivna i Write. Samtliga är utskrivna på papper.

Nåväl, detta var lite om historien. Nu till kolumnerna jag använder i Calc:

Första kolumnen är Död och den tänkte jag utveckla så den innehåller månad och dag i framtiden. Dessutom vill jag ha källan till dödsdatumet. Detta kompletterar jag med i Base eftersom det inte finns någon data än så länge. Källan ska vara dödboken som finns i kyrkböckerna på samma sätt som bouppteckningarna. En av anledningarna till att jag väljer en annan källa än bouppteckningarna själv till dödsdatumet är att dom äldsta bouppteckningarna inte alltid har dödsdatumet skrivet eftersom dom inte var så noga på den tiden. Sen följs den av Förnamn, efternamn, plats vid dödsfallet (socken, ort, plats). Här är det tre platser som specificerar var den döda dog. Sen har vi kolumnen BoupptID där jag satt upp ordningen från nummer 1, 2, 3 osv. i den ordningen bouppteckningen kommer in i en pärm. Det blir alltså en unik siffra här och jag väljer då att sätta nyckel på BoupptID.

Sen kommer vi till de färglagda kolumnerna som innehåller källan, dvs. där man hittar originalet till bouppteckningen. Där har vi kolumnerna HR som står för häradsrätt, vilken bok bouppteckningen står i och bouppteckningsnumret. Man kan se att jag har grön och blå färg. Finns även lila färg. Anledningen är att en bouppteckning kan ha flera källor. När bouppteckningen gjordes en gång i tiden så glömde dom ibland att skriva upp något markområde eller så kan en släkting 100 år senare begära att bouppteckningen ska kompletteras för att arv ska gå rätt till. Det mesta jag har sett hittills är att en person kan ha bouppteckning plus två tillägg, alltså tre olika källor. Rent hypotetiskt kan det finnas obegränsat många källor och det är detta som är det stora problemet eftersom Calc inte klarar av en-till-många-relationer och därför är en databas ett måste.

Skissen jag gjort upp över hur databasen kommer att se ut är denna:

Det handlar alltså om sju tabeller där tblBouppt är huvudtabellen. Notera att jag satt tbl och fld framför alla tabeller och fältnamn. Bra om man använder en standard så det blir lätt att arbeta med databasen vid senare tillfälle. tbl står för table och fld för field. Ju mer komplex en databas, desto större anledning med att göra namnen så snygga möjligt för att slippa merarbete. Egentligen ska man ha engelska namn på alla tabeller och fältnamn för att slippa åäö men för att göra exemplet mer lättförståeligt så kör jag på svenska.

Om vi kollar på huvudtabellen så ser vi att fldSockenID, fldOrtID och fldPlatsID är kopplade till var sin tabell. Detta underlättar för vi får en en-till-många-relation där varje ort får ett nummer. Vi minimerar antalet skrivna tecken iom. att varje ort bara behöver skrivas in en gång, exempelvis kan Öckerö symbolisera 1 och vi får en siffra istället för sex bokstäver. Dessutom kan man har varit slarvig och stavat fel till något socken men genom att korrigera detta i tblSocken så ändras felskrivningen i hela databasen.

Öckerö används i c:a 99% av fallen och därför var en egen tabell som heter tblSocken oundviklig. tblOrt behövs också eftersom Öckerö socken domineras av Hönö, Öckerö (ö), Fotö osv. Dessutom återkommer platsnamnen också. Blir tre extra tabeller.

På vänster sida om huvudtabellen ser vi relationen en-till-många på samma sätt som jag demonstrerat här. Källtabellen (tblKälla) kopplas samman med bouppteckningstabellen (tblBouppt) via tblBoupptKälla. Alltså hamnar all viktig data i tabellen tblBoupptKälla där man kan ha flera källor till en och samma person.

I den sista tabellen som heter tblHR samlar vi alla häradsrätter. Här är också återupprepningar. I mitt fall handlar det om maximalt 10 olika härader till 3600 personer och därför lägger vi dessa i en egen tabell.

Detta exemplet kommer jag att realisera för egen del och dessutom kommer jag att blogga om samtliga saker jag gör. Problemet jag försöker ta itu med är fldBok som ingår i tblKälla. Detta fält innehåller data i stil med FII:1, FII:2 osv. När jag sorterar denna kolumn så blir det fel ordning eftersom det sorteras i bokstavsordning. Jag vill ha sortering efter siffrorna och är nära lösningen nu men det får bli i en senare blogg. 🙂

  4 Responses to “Optimering av databas (relationsdatabas-exempel)”

  1. Hallå där!
    Jag har en fundering…
    Hur uppdaterar man en tabell med nya data från en annan tabell? Jag tänker mig att antalet rader kan vara väldigt många i ursprungstabellen medan uppdateringstabellen bara innehåller några få rader – de med nya data.
    I mitt fall har jag en original-tabell som heter Land och en tabell med nya värden som heter Landsnummer, och kolumnerna som ska matchas heter båda Land.
    Jag har försökt köra ett SQL-uttryck i Base som ser ut så här, men det funkar inte:
    UPDATE ”Land” SET ”Land”.”Landsnummer” = ”Landsnummer”.”Landsnummer” WHERE ”Land”.”Land” = ”Landsnummer”.”Land”
    Jag får ett felmeddelande ”1: Column not found: Landsnummer.Land”
    /Bosse

  2. Tack för tipset!
    Det ska jag göra.

  3. Till Bo:
    Din SQL fungerar ej för du anger inte vara datan ska hämtas ifrån. I detta fall vill du ta data från tabellen Landsnummer och stoppa in den i tabellen Land, men bara för de rader som har samma land i respektive tabell. Då källan saknas får du felmeddelande om detta.

    Prova följande SQL istället:
    UPDATE ”Land”
    SET ”Landsnummer” =
    (SELECT ”Landsnummer”.”Landsnummer”
    FROM ”Landsnummer”
    WHERE ”Landsnummer”.”Land” = ”Land”.”Land”)
    WHERE EXISTS
    (SELECT ”Landsnummer”.”Landsnummer”
    FROM ”Landsnummer”
    WHERE ”Landsnummer”.”Land” = ”Land”.”Land”);

Kommentera

%d bloggare gillar detta: