<?xml version="1.0" encoding="UTF-8"?>
<chapter id="details.database">
<chapterinfo>
  <authorgroup>
    <author
>&Tony.Bloomfield; &Tony.Bloomfield.mail;</author>
  </authorgroup>
  <date
>2011-07-21</date>
  <releaseinfo
>4.6</releaseinfo>
</chapterinfo>

<title
>Andmebaas</title>

<sect1 id="details.database.usage">
<title
>Relatsiooniliste andmebaaside kasutamine</title>

<sect2>
<title
>Sissejuhatus</title>
<para
>Alates väljalaskest 1.0 võimaldab &kappname; hoida oma andmeid relatsioonilises andmebaasis. Üks selle standardse vormingu kasutamise eeliseid on see, et nii saab oma andmeid näha mõne graafilise kasutajaliidesega, näiteks OpenOffice.org<trademark class="copyright"
></trademark
> või LibreOffice<trademark class="copyright"
></trademark
>, ehk isegi vormingus, mida &kappname; praegu ei paku. Samuti peaks SQL-i ("struktuurpäringukeel", mida pruugitakse kogu maailmas relatsiooniliste andmebaaside kasutamisel) mõningane tundmine andma võimaluse eksportida andmeid märksa vähema vaeva muudesse, näiteks eelarvetega majandavatesse rakendustesse. </para>
<para/>
</sect2>

<sect2
><title
>Ettevalmistus</title>

<para
>Andmebaasi kasutamiseks tarvitab &kappname; &Qt; pakutavat SQL-moodulit, mis kuulub &Qt; tarkvara koosseisu. Moodul toetab terve rea draiverite varal mitmesuguseid andmebaasisüsteeme. Levinumate avatud lähtekoodiga süsteemide hulka, millele on draiverid olemas, kuuluvad MySQL<trademark class="registered"
></trademark
>, SQLite (alates versioonist 3) ja PostgreSQL. Moodul toetab ka "tõsisemaid", võimsamates kommertsrakendustes levinud süsteeme, näiteks Oracle<trademark class="registered"
></trademark
> ja IBM DB2<trademark class="registered"
></trademark
>. </para>

<para
>Kui jätta välja SQLite, kasutavad need süsteemid kliendi-serveri mudelit, milles "kliendi" tarkvara on "sinu" masinas, server aga elab samas masinas andmebaasiga, mis võib asuda ka kuskil mujal võrgus. Loomulikult on sellise isiklike rahaasjade rakenduse nagu &kappname; korral tavaliselt sinu masin korraga nii klient kui ka server. Seepärast on su esimene ülesanne otsustada, millist andmebaasisüsteemi tarvitada, ning seejärel paigaldada kliendi ja usutavasti ka serveri tarkvara. </para>

<para
>Lisaks andmebaasitarkvarale tuleb paigaldada ka vastav &Qt; draiveri moodul. Enamik distributsioone pakub draiverimooduleid vähemalt levinumate andmebaaside tarbeks. Aga neid võib otsida <ulink url="http://qt-project.org"
>&Qt; veebilehelt</ulink
> märksõnaga "SQL drivers". </para>

<note>
  <para
>SQLite ei pruugi kliendi-serveri mudelit: iga andmebaas asub tavalises failis, olgu võrgus või mitte, ning sellele pääseb ligi tavalisel viisil, mida pakub juba operatsioonisüsteem. Sel juhul tuleb paigaldada ainult üks tarkvarapakett ja draiver. Samuti ei pruugi osa allpool jagatavast teabest, eriti mis puudutab andmebaasi haldamist, olla päris täpne SQLite'i puhul. </para>
</note>
</sect2>

<sect2>
<title
>Haldamine</title>

<para
>Andmebaaside eest hoolitsemine on pisut keerulisem kui tavaliste failide eest. Igal süsteemil on oma meetodid vajalike haldustoimingute, näiteks andmebaaside loomise, eri kasutajatele õiguste omistamise, varukoopiate tegemise jjms. tarbeks. Nende ülesannete kirjeldamine väljub käesoleva käsiraamatu raamest, kuid kõik toetatud tooted pakuvad omaenda päris põhjalikku dokumentatsiooni ning juba põgus otsimine veebis viib sind kindlasti õige mitme asjakohase ja tulusa õppematerjali juurde. </para>

<sect3>
<title
>Andmebaasi loomine</title>

<para
>KMyMoney sisaldab koodi algse andmebaasi loomiseks, kus sinu andmeid hakatakse hoidma, kui sul sellist andmebaasi veel ei ole. Siiski on väga soovitatav andmebaas juba eelnevalt luua, sest enamik süsteeme pakub mitmesuguseid valikuid, mis võivad tublisti kasuks tulla. Üks selliseid, mis ehk eriti oluline vähemalt osadele kasutajatele, on tekstiväljadel kasutatava kodeeringu (&eg; UTF-8) paikapanemine. </para>

<para
>Praegu tuleb sul ka määrata kindlaks eri kasutajate õigused andmebaasis operatsioonide ettevõtmiseks. Enamikus süstemides saab kasutaja, kes loob andmebaasi, automaatselt ka kõik õigused, kuid igal juhul on see asi, mille puhul tasub uurida andmebaasi enda dokumentatsiooni. </para>

<para
>Andmebaasi esimeseks kasutamiseks ja võib-olla ka hiljem, kui andmebaasi kujundust muudad, vajad õigust ehk privileegi luua ja muuta tabeleid ja vaateid (vt allpool). Eri süsteemides võidakse õiguste kohta kasutada eri nimetusi, kuid vähemalt CREATE ja ALTER peaksid siiski üldlevinud olemas. Normaalseks tööks peab sul olema õigus lugeda ja kirjutada kirjeid, mis SQL-is on tavaliselt defineeritud SELECT, INSERT, UPDATE ja DELETE õigustena. </para>
</sect3>

<sect3>
<title
>Tabelite loomine</title>

<para
>Esimesel korral püüab &kappname; luua vajaliku tabelistruktuuri. Maksimaalse ühilduvuse tagamiseks eri andmebaasitüüpidega on kasutusel ainult väike osa levinud andmetüüpidest. Siiski võib tekkida olukord, kui mõni tüüp ei ole toetatud ning sel juhul on ette nähtud genereerida tabelite loomiseks vajalik SQL-i kood. Koodi saab seejärel vastavalt vajadusele muuta ja luua tabelid juba väljaspool &kappname;. Kui peaksid sellisesse olukorda sattuma, leiad tavaliselt abi arendajate postiloendist &devlist;. Täpsemalt loe selle kohta osa <link linkend="details.database.generatesql"
>Andmebaasi loomine käsitsi</link
>. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase">
<title
>Andmebaasi loomine</title>

<para
>Ava või impordi &kappname; abil olemasolev andmefail või loo uus. Seejärel vali menüüst <guimenu
>Fail</guimenu
> käsk <guimenuitem
>Salvesta andmebaasina</guimenuitem
>. See avab järgmise dialoogi: </para>

<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="select_database.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Täida väljad vastavalt valitud andmebaasitüübile (nagu ikka, on kohustuslikud väljad esile tõstetud) ja klõpsa andmebaasi loomiseks <guibutton
>OK</guibutton
>. </para>

<sect3>
<title
>Andmebaasi tüüp</title>

<para
>Siin on loetletud kõik sinu süsteemi paigaldatud &Qt; SQL-draiverid. Vali oma andmebaasitüübi draiver. Kui soovitut nimekirjas ei ole, tuleb paigaldada vajalik draiver. Uuri selle kohta oma distributsiooni dokumentatsiooni või mine <ulink url="http://qt-project.org/" type=""
>&Qt; veebilehele</ulink
> ja otsi seal märksõna "SQL drivers". </para>
</sect3>

<sect3>
<title
>Fail (ainult SQLite)</title>
<para
>SQLite'il on üks andmebaas faili kohta, mistõttu siia tuleb sisestada failinimi, milles soovid andmebaasi luua. Süsteemi sirvimiseks klõpsa failinimest paremal asuvale ikoonile. SQLite'i andmebaaside korral ei ole väljadel <guilabel
>Masina nimi</guilabel
>, <guilabel
>Kasutajanimi</guilabel
> ja <guilabel
>Parool</guilabel
> tähtsust. Failisüsteemis peavad SQLite'i failile olema seatud vajalikud lugemis- ja kirjutamisõigused, et parajasti sisse logitud kasutaja saaks pääseks sellele ligi. </para>
</sect3>

<sect3>
<title
>Andmebaasi nimi (teised)</title>
<para
>Vaikimisi on andmebaasi nimi KMyMoney, kuid sa võid valida mis tahes muu meeldiva nime. Mõne andmebaasitüübi korral ei pruugi &kappname; olla võimeline andmebaasi looma, nii et see tuleb juba eelnevalt luua. Kuid enamasti suudab &kappname; siiski vajaduse korral luua kogu tabelistruktuuri. Vastasel juhul pead tabelid ise looma. Täpsemalt kõneleb sellest osa <link linkend="details.database.generatesql"
>Andmebaasi loomine käsitsi</link
>. </para>
</sect3>

<sect3
><title
>Masina nimi</title>
<para
>Tavalise kasutaja korral on selleks vaikimisi <quote
>localhost</quote
> ehk masin, mida parajasti kasutad. Võrguandmebaaside korral tuleb siia sisestada ühendatud masina nimi. </para>

</sect3>

<sect3>
<title
>Kasutajanimi ja parool</title>
<para
>Siin korrektsete väärtuste sisestamiseks kontrolli andmebaasi suhtes kehtestatud õigusi või võta ühendust andmebaasi administraatoriga. Kasutajanimi peab suutma kirjeid valida (SELECT), lisada (INSERT), uuendada (UPDATE) ja kustutada (DELETE). Kui kasutajanimi on sama sinu süsteemi sisselogimise nimega, ei ole enamasti parool tarvilik. </para>
</sect3>
</sect2>

<sect2>
<title
>Andmete kasutamine</title>

<sect3>
<title
>Tabeli kujundus</title>

<para
>Oma andmete kasutamiseks &kappname;s vali menüüst <guimenu
>Fail</guimenu
> käsk <guimenuitem
>Ava andmebaas</guimenuitem
>. Ilmub eespool kirjeldatule sarnane dialoog. </para>

<note>
<para
>Kui oled loonud andmebaasi kõigepealt faili avades ja siis käsku <guimenuitem
>Salvesta andmebaasina</guimenuitem
> valides, nagu eespool õpetatud, siis salvestatakse kõik edasised muudatused sinu andmetees ainult andmebaasi, mitte aga faili. See tähendab, et saad kasutada faili oma andmete konkreetse ajahetke jäädvustuse, omamoodi varukoopiana. Samasuguse uue varukoopia tegemiseks ava andmebaas, vali menüükäsk <menuchoice
><guimenu
>Fail</guimenu
><guimenuitem
>Salvesta kui...</guimenuitem
></menuchoice
> ja anna failile sobiv nimi. Pea meeles, et avaksid seejärel uuesti andmebaasi, et &kappname; ei jätkaks faili kasutamist. </para>
</note>

<para
>Oma andmebaasi kasutamiseks teistes vormingutes on vaja mõningaid teadmisi sellest, kuidas neid relatsioonilises andmebaasis hoitakse. Lihtsaim viis sellest ülevaade saada on avada andmebaas mõnes graafilises kasutajaliideses, näiteks LibreOffice. See toob ära loetelu tabelitest, millest sinu andmebaas koosneb, ja luban näha nende kõigi kujundust. </para>

<para
>Andmete väljavõtmiseks näiteks arvutustabelisse või välisesse faili on peaaegu kindlasti vaja valida ühendatud andmed enam kui ühest tabelist. Seda saab teha tabeleid "ühendades", kasutades välja, mis on neile ühine. Selle kohta jagavad rohkelt teavet eespool mainitud andmebaaside õppematerjalid internetis. Järgmises tabelis on ära toodud väljad, millega määratakse niisuguseid tabelitevahelisi seoseid: </para>

<informaltable>
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Seos</para>
        </entry>
        <entry valign="top">
          <para
>Sobitab selle</para>
        </entry>
        <entry valign="top">
          <para
>Sellega</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Rahaasutused ja kontod</para>
        </entry>
        <entry valign="top">
          <para
>kmmInstitutions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.institutionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Ülem- ja alamkontod</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.parentId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Tehingud ja alltehingud (vt märkus 1)</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.transactionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Kontod ja alltehingud</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.accountId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Maksesaajad ja alltehingud</para>
        </entry>
        <entry valign="top">
          <para
>kmmPayees.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.payeeId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Ajaplaanid ja tehingud</para>
        </entry>
        <entry valign="top">
          <para
>kmmSchedules.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Tehingud ja vääringud</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Kontod ja väärtpaberid (vt märkus 2)</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Väärtpaberid ja hinnad</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId või kmmPrices.toId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Vääringukursid</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId või kmmPrices.toId</para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Märkused: </para>

<para
>1 &#x2013; txType = &#x201C;N&#x201D; tavaliste tehingute puhul, &#x201C;S&#x201D; planeeritud tehingute puhul </para>

<para
>2 &#x2013; kui kmmAccounts.isStockAccount = &#x201C;Y&#x201D; </para>
</sect3>

<sect3>
<title
>Väljade vormingud</title>

<para
>Mitmeid andmevälju hoitakse sisemises vormingus, mis ei pruugi olla muudele programmidele kuigi kasulik. Sel juhul on teave topeldatud nii sisemises kui ka välises vormingus. </para>

<para
>Rahakoguseid ja aktsiaväärtusi näidatakse nii murruna kui ka, kui väljanime järel on "Formatted", sel moel, nagu neid näeb monitoris. </para>
  
<para
>Veel mõned väljad, näiteks kontotüüp, esinevad samugi nii arvkoodina kui ka, kui väljanimele on lisatud "String", rakenduse pakutaval kujul ja keeles. </para>
</sect3>

<sect3>
<title
>Andmete uuendamine</title>

<para
>Andmete hoidmine standardses vormingus lubab sul neid muuta ka väljaspool &kappname;. ÄRA TEE SEDA, kui sa ei ole kindel, et tead päris täpselt, mida ette võtad, ning alati tee kindlasti kõigepealt oma andmetest varukoopia. Kui midagi läheb viltu, ei pruugi &kappname; olla isegi võimeline sinu andmetele ligi pääsema ning sa võid neist sootuks ilma jääda. Sind on hoiatatud! </para>
</sect3>

<sect3>
<title
>Salvestatud päringud</title>

<para
>Enamik andmebaasisüsteeme lubab salvestada levinumaid päringuid ja protseduure ning mõnel juhul hoitakse neid lausa tabelite või muude objektidena andmebaasis endas. Nagu eelnevast võis juba oletada, algavad kõik tabelid, mida &kappname; kasutab, väikeste tähtedega "kmm". Sellest standardist tuleks kinni pidada ning uuendataksegi ainult tabeleid, mis nende tähtedega algavad. Eeldusel, et sa oled neid oma päringutele nime andes vältinud, ei tohiks mingeid probleeme esineda. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql">
<title
>Andmebaasi loomine käsitsi</title>
<note>
  <para
>Siin kõneldakse kogenumatele kasutajatele mõeldud andmebaaside kasutamise viisidest, mille tavalised kasutajad võivad vahele jätta. </para>
</note>

<sect3>
<title
>Millal kasutada</title>
<para
>Võib esineda juhtumeid, mil &kappname; ei suuda andmebaasi automaatselt luua või loob selle ilma mõningate kasutajale vajalike valikuteta. Näiteks ei pruugi andmebaasisüsteem täielikult ühilduda standardse SQL-i kasutamisega või lisandub uute süsteemide toetus, mida &kappname;s ei ole veel põhjalikult testitud. </para>
<para
>Enne selle võimaluse kasutamist tuleks püüa ise luua andmebaasikirje (&ie; lauseega CREATE DATABASE). Kui andmebaas on olemas, võib &kappname; ehk olla suuteline looma tabelid ja muu sellise tavapärase andmebaasi salvestamise protseduuriga, mida kirjeldati eespool. </para>
</sect3>

<sect3>
<title
>SQL-i genereerimine</title>
<para
>Kui see ei õnnestu, saab ka genereerida põhilised SQL-i käsud, mida on vaja rakenduse nõutavate tabelite, vaadete ja indeksite loomiseks. Vali menüüst <guimenu
>Tööriistad</guimenu
> käsk <guimenuitem
>Andmebaasi SQL-i genereerimine</guimenuitem
>. Ilmub järgmine dialoog: </para>
<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="generate_sql.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Andmebaasi tüübi valimisel ilmub sobiv SQL tekstikasti <guilabel
>Loodav SQL</guilabel
>, mida kasutaja võib soovi korral muuta või salvestada tekstifailina, klõpsates nupule <guibutton
>Salvesta SQL</guibutton
>. Viimasel juhul peab andmebaasi looma nende haldusvahenditega, mida pakub andmebaasisüsteem. </para>
<para
>Kui soovid pärast teksti muutmist dialoogis, et &kappname; looks andmebaasi, tuleb täita ka dialoogi teised väljad, nagu kirjeldatud eespool osas <link linkend="details.database.selectdatabase"
>Andmebaasi loomine</link
>, ja klõpsata nupule <guibutton
>Loo tabelid</guibutton
>. Pane tähele aga seda, et kui tegu pole just SQLite'iga, tuleb kas esimese käsuna anda sobiv CREATE DATABASE lause või olla seda juba varem teinud väljaspool &kappname;. </para>
</sect3>

<sect3>
<title
>Hoiatus</title>
<para
>Kõigi põhiliste tabelite ja vaadete (mille nimede alguses seisab "kmm") definitsioonide muutmisel tuleb olla äärmiselt ettevaatlik. Mõni muudatus, näiteks täisarvuvälja pikkuse suurendamine, ei pruugi õieti mingit mõju avaldada, aga kunagi ei tohiks välju eemaldada ega nende järjekorda muuta, sest muidu ei pruugi &kappname; enam töötada või võid oma andmed tõsiselt ära rikkuda. </para>
<para
>Indeksite lisamine või eemaldamine võib küll jõudlust parandada, aga tuleks teada, et võib ka vastupidi juhtuda. Parima tulemuse saavutamseks peaks vähemalt teataval määral olema kursis &kappname; sisemiste operatsioonidega. </para>
</sect3>

</sect2>

<sect2>
<title
>Krüptimine</title>

<para
>Andmebaasi andmete krüptimine ei ole praegu veel toetatud. </para>
</sect2>
</sect1>
</chapter>
