<?xml version="1.0" encoding="UTF-8"?>
<chapter id="details.database">
<chapterinfo>
  <authorgroup>
    <author
>&Tony.Bloomfield; &Tony.Bloomfield.mail;</author>
  </authorgroup>
  <date
>21 липня 2011 року</date>
  <releaseinfo
>4.6</releaseinfo>
</chapterinfo>

<title
>База даних</title>

<sect1 id="details.database.usage">
<title
>Користування реляційними базами даних</title>

<sect2>
<title
>Вступ</title>
<para
>У версії 1.0 &kappname; надає вам змогу зберігати ваші дані у реляційній базі даних. Однією з переваг використання цього загальновизнаного формату є те, що він уможливлює перегляд ваших даних за допомогою графічних інтерфейсів, зокрема OpenOffice.org<trademark class="copyright"
></trademark
> або LibreOffice<trademark class="copyright"
></trademark
>, а також перетворення їх у формат, з яким ще не може працювати &kappname;. Крім того, навіть незначні знання SQL (Structured Query Language (структурованої мови запитів), мови, що повсюдно використовується для доступу до реляційних баз даних) нададуть вам змогу спростити експортування даних до зовнішньої програми, наприклад до програми для роботи з бюджетами. </para>
<para/>
</sect2>

<sect2
><title
>Приготування</title>

<para
>Для отримання доступу до бази даних &kappname; використовує модуль SQL, створений компанією &Qt; Software як частина програмної бібліотеки &Qt;. У цьому модулі на основі драйверів передбачено підтримку декількох різних систем роботи з базами даних. Серед найпопулярніших систем з відкритим кодом такі драйвери створено для MySQL<trademark class="registered"
></trademark
>, SQLite (лише версії 3 та більших версій) і PostgreSQL. У модулі передбачено також підтримку «важчих», промислових систем, зокрема Oracle<trademark class="registered"
></trademark
> і IBM DB2<trademark class="registered"
></trademark
>. </para>

<para
>За винятком SQLite, у вказаних системах використовується клієнт-серверна модель: клієнтське програмне забезпечення працює на «вашому» комп’ютері, а серверна частина — на комп’ютері, на якому зберігається сама база даних і який може обмінюватися даними з вашим комп’ютером локальною мережею або інтернетом. Звичайно ж, у типовому режимі керування вашими особистими фінансами &kappname; «ваш» комп’ютер може виконувати обидві функції: клієнта і сервера. Отже, насамперед вам слід визначитися з тим, яку систему роботи з базою даних ви бажаєте використовувати, отже визначитися: слід встановити лише клієнт чи клієнт разом з сервером. </para>

<para
>Окрім самого програмного забезпечення для роботи з базою даних, вам слід встановити і відповідний модуль драйвера &Qt;. Модулі драйверів для більшості поширених баз даних можна знайти у пакунках більшості дистрибутивів. Якщо потрібного вам пакунка немає, пошукайте на <ulink url="http://qt-project.org"
>вебсайті &Qt; Software</ulink
> за ключовими словами «SQL drivers». </para>

<note>
  <para
>SQLite не працює у межах моделі клієнт-сервер; всі бази даних зберігаються у звичайних файлах, локальних або віддалених, програма отримує до них доступ за допомогою звичайних для основної операційної системи методів. У разі використання цієї системи роботи з базами даних достатньо встановити лише один пакунок програмного забезпечення та драйвер. Крім того, деякі з наведених нижче відомостей, що стосуються адміністрування, можуть бути незастосовними для SQLite. </para>
</note>
</sect2>

<sect2>
<title
>Адміністрування</title>

<para
>Нагляд за базами даних є трохи складнішим, ніж робота зі звичайними файлами. У різних системах передбачено різні способи виконання необхідних адміністративних завдань, зокрема створення баз даних, призначення прав доступ для користувачів, створення резервних копій тощо. Опис цих способів не належить до предмету цього підручника, але ви можете знайти відповіді на свої питання у документації програми для роботи з базами даних: простий пошук у інтернеті надасть вам змогу отримати адреси для отримання підручників з відповідного питання. </para>

<sect3>
<title
>Створення бази даних</title>

<para
>У програмі передбачено можливість створення початкової бази даних для зберігання ваших даних, якщо такої бази даних ще не існує. Але автори програми наполегливо рекомендують вам попередньо створити цю базу даних, оскільки  у більшості програм для роботи з базами даних передбачено багато параметрів, які можуть вплинути на характеристики створеної бази даних. Одним з таких важливих параметрів є визначення кодування символів (наприклад UTF-8), яке слід використовувати у полях, що міститиме текстові дані. </para>

<para
>Крім того, вам слід вказати права доступу до виконання певних дій різними користувачами бази даних. Здебільшого, користувачеві, який створив базу даних буде автоматично надано всі можливі дозволи, але вам все ж варто звернутися до документації, щоб у цьому переконатися. </para>

<para
>Під час першого доступу до бази даних і, можливо, наступних доступів, коли ви змінюватимете компонування бази даних, вам потрібні будуть права доступу (які ще називають привілеями) для створення і зміни таблиць і переглядів (див. наступний розділ). Назви полів прав доступу/привілеїв у різних системах можуть бути різними, але здебільшого цими назвами будуть CREATE і ALTER. Для нормальної роботи вам потрібно мати права доступу на читання і запис; ці дозволи, зазвичай, визначаються ключовими словами SQL SELECT, INSERT, UPDATE і DELETE. </para>
</sect3>

<sect3>
<title
>Створення таблиць</title>

<para
>Під час першого доступу до бази даних &kappname; спробує створити потрібну програмі структуру бази даних. Щоб досягти максимальної сумісності між базами даних різних типів, програма використовуватиме лише певну підмножину типових типів даних. Але можливі випадки, коли окремі типи не підтримуватимуться. У такому разі слід якось забезпечити створення коду SQL потрібного для створення таблиць. Цей код згодом може бути змінено бажаним чином і використано для створення баз даних поза межами &kappname;. Якщо ви опинитеся у подібній ситуації, зазвичай, довідку з потрібних вам команд можна отримати у списку листування &devlist;. Щоб дізнатися про це більше, зверніться до розділу <link linkend="details.database.generatesql"
>Створення бази даних вручну</link
>. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase">
<title
>Створення бази даних</title>

<para
>За допомогою &kappname; відкрийте або імпортуйте існуючий файл з даними або створіть новий файл. Після цього скористайтеся пунктом <guimenuitem
>Зберегти як базу даних</guimenuitem
> з меню <guimenu
>Файл</guimenu
>. У відповідь програма відкриє таке діалогове вікно: </para>

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

<para
>Заповніть поля, що відповідають вказаному типу бази даних (як і всюди, обов’язкові до заповнення поля буде підсвічено), а потім натисніть кнопку <guibutton
>Гаразд</guibutton
>, щоб наказати програмі створити базу даних. </para>

<sect3>
<title
>Тип бази даних</title>

<para
>На цій панелі буде показано список всіх драйверів SQL &Qt;, встановлених у вашій системі. Оберіть драйвер для вашого типу бази даних. Якщо потрібного вам драйвера немає у списку, вам доведеться встановити його. Ознайомтеся з документацією з вашого дистрибутива або відкрийте сторінку <ulink url="http://qt-project.org/" type=""
>вебсайта &Qt; Software</ulink
> і виконайте пошук за ключовими словами «SQL drivers». </para>
</sect3>

<sect3>
<title
>Файл (лише SQLite)</title>
<para
>У SQLite кожна база даних зберігається у окремому файлі, отже вам слід зазначити назву файла, у якому ви бажаєте створити базу даних. Щоб вказати розташування файла у файловій системі, натисніть кнопку з піктограмою, розташовану праворуч від поля назви файла. Для баз даних SQLite вміст полів <guilabel
>Назва вузла</guilabel
>, <guilabel
>Користувач</guilabel
> і <guilabel
>Пароль</guilabel
> не має значення. Файл SQLite повинен мати належні права доступу на читання або запис у файловій системі, щоб поточний користувач програми зміг отримувати до нього доступ. </para>
</sect3>

<sect3>
<title
>Назва бази даних (інші)</title>
<para
>Типовою назвою бази даних буде KMyMoney, але ви можете обрати будь-яку іншу назву. Програму &kappname; може бути не пристосовано до створення певних типів баз даних, отже вам доведеться створити такі бази даних за допомогою сторонніх інструментів адміністрування баз даних. Але програма &kappname;, зазвичай, здатна створити всю потрібну структуру відповідної бази даних. Якщо можливості програми не задовольняють ваші потреби, ви можете створити базу даних власноруч. Докладніше про це можна дізнатися з розділу <link linkend="details.database.generatesql"
>Створення бази даних вручну</link
>. </para>
</sect3>

<sect3
><title
>Назва вузла</title>
<para
>Для типового користувача типовою назвою вузла буде «localhost», отже цю назву не потрібно змінювати. Якщо ж ви маєте справу з базами даних у мережі, введіть назву вашого вузла. </para>

</sect3>

<sect3>
<title
>Ім’я користувача і пароль</title>
<para
>Щоб визначити правильні значення у цих полях, перегляньте права доступу до вашої бази даних або зверніться до адміністратора бази даних. Вказаний вами користувач повинен мати права доступу для пошуку, вилучення, вставлення та оновлення записів бази даних. Якщо ім’я користувача збігається з іменем користувача системи, вказувати пароль зазвичай не потрібно. </para>
</sect3>
</sect2>

<sect2>
<title
>Доступ до ваших даних</title>

<sect3>
<title
>Компонування таблиці</title>

<para
>Щоб отримати доступ до даних у &kappname;, скористайтеся пунктом <guimenuitem
>Відкрити базу даних</guimenuitem
> у меню <guimenu
>Файл</guimenu
>. Програма відкриє діалогове вікно, подібне до показано вище. </para>

<note>
<para
>Якщо вами було створено базу даних відкриттям файла з наступним використанням дії <guimenuitem
>Зберегти як базу даних</guimenuitem
>, як це описано вище, будь-які наступні зміни, внесені до ваших даних, зберігатимуться лише у базі даних, а не у файлі. Це означає, що ви можете використовувати файл як резервну копію або знімок даних у певний момент часу. Щоб створити нову резервну копію у файлі, відкрийте базу даних і скористайтеся пунктом <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Зберегти як...</guimenuitem
></menuchoice
>, надайте файлу відповідної назви. Не забудьте потім повторно відкрити вашу базу даних, щоб &kappname; не зберігала зміни у файлі. </para>
</note>

<para
>Для отримання доступу до ваших даних у різних форматах вам слід ознайомитися зі способами зберігання даних у реляційних базах даних. Набагато простіше відкрити вашу базу даних у графічній оболонці, зокрема OpenOffice.org. Ви побачите список різноманітних таблиць, з яких складається база даних і зможете переглянути компонування всіх цих таблиць. </para>

<para
>Щоб видобути дані, наприклад до електронної таблиці чи зовнішнього файла, майже завжди потрібно виконати збирання пов’язаних даних з декількох таблиць. Програма робить це шляхом «з’єднання» таблиць на основі спільного для них поля. Докладніше дізнатися про алгоритми роботи баз даних ви можете з підручників, про які ми згадували раніше. У наведеній нижче таблиці вказано поля, які використовуються для встановлення подібних міжтабличних взаємозв’язків. </para>

<informaltable>
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Взаємозв’язок</para>
        </entry>
        <entry valign="top">
          <para
>Відповідність</para>
        </entry>
        <entry valign="top">
          <para
>З</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Установи і рахунки</para>
        </entry>
        <entry valign="top">
          <para
>kmmInstitutions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.institutionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Батьківські/Дочірні рахунки</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.parentId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операції і дроблення (див. Зауваження 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
>Рахунки і дроблення</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.accountId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Отримувачі і дроблення</para>
        </entry>
        <entry valign="top">
          <para
>kmmPayees.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.payeeId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Розклади і операції</para>
        </entry>
        <entry valign="top">
          <para
>kmmSchedules.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операції і валюти</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Рахунки і цінні папери (див. Зауваження 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
>Цінні папери і ціни</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId або kmmPrices.toId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Курси валют</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId або kmmPrices.toId</para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Нотатки: </para>

<para
>1 &#x2013; txType = &#x201C;N&#x201D; для звичайних операцій, &#x201C;S&#x201D; для запланованих операцій </para>

<para
>2 &#x2013; якщо kmmAccounts.isStockAccount = &#x201C;Y&#x201D; </para>
</sect3>

<sect3>
<title
>Формати полів</title>

<para
>Вміст деяких з полів даних зберігається у внутрішньому форматі, яким, можливо, не зможуть скористатися зовнішні програми. Якщо у таблиці є такі поля, їх вміст буде дубльовано у зовнішньому форматі. </para>

<para
>Грошові суми та вартості акцій буде показано у форматах чисельник/знаменник і, у полі з суфіксом назви «Formatted», у формі, у якій їх буде показано на екрані. </para>
  
<para
>Так само, деякі з полів, зокрема поле типу рахунку буде збережено у формі числового коду і, у полі з суфіксом назви «String», у формі і форматі мови програми. </para>
</sect3>

<sect3>
<title
>Оновлення ваших даних</title>

<para
>Зберігання даних у загальновизнаному стандартному форматі не надає вам змоги змінювати дані поза межами програми &kappname;. НЕ РОБІТЬ ЦЬОГО, якщо вам не відомі наслідки ваших дій, завжди спочатку створюйте резервні копії даних. Якщо ви зробите щось не так, &kappname; може втратити можливість доступу до ваших даних, ви навіть можете просто їх втратити. Ми вас попереджали! </para>
</sect3>

<sect3>
<title
>Збережені запити</title>

<para
>У більшості систем роботи з базами даних передбачено можливість зберігання типових запитів і процедур, а у деяких випадках їх можна зберігати як таблиці або інші об’єкти у самій базі даних. Як ви вже певно зрозуміли, назви всіх таблиць, які використовуються у &kappname;, починаються з літер у нижньому регістрі «kmm». Цей стандарт підтримуватиметься і надалі: оновлюватимуться лише таблиці, назви яких починатимуться з цих літер. Отже, якщо ви уникатимете використання цих літер у назвах ваших запитів і процедур, у вас не повинно виникнути ніяких проблем. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql">
<title
>Створення бази даних вручну</title>
<note>
  <para
>У цьому розділі описано способи керування базами даних для досвідчених користувачів, його може бути пропущено звичайними користувачами програми. </para>
</note>

<sect3>
<title
>Умови використання</title>
<para
>Іноді програма &kappname; не здатна створити базу даних у автоматичному режимі або створює базу даних, яка за певними параметрами не задовольняє потреби користувача. Наприклад, система бази даних може не повністю відповідати стандартному використанню SQL або користувачеві потрібна підтримка новітніх систем, які ще не достатньо перевірено на надійність користування у &kappname;. </para>
<para
>Перш ніж користуватися описаними способами, вам слід спробувати створити базу даних власноруч (тобто за допомогою інструкції CREATE DATABASE). Після створення бази даних &kappname; зможе створювати у ній, наприклад, таблиці під час звичайного процесу збереження бази даних, описаного вище. </para>
</sect3>

<sect3>
<title
>Створення SQL</title>
<para
>Якщо описаний вище спосіб не спрацює, основні потрібні вам для створення різноманітних таблиць, областей перегляду та покажчиків команди SQL можна створити окремо. Скористайтеся пунктом <guimenuitem
>Створити базу даних SQL</guimenuitem
> з меню <guimenu
>Інструменти</guimenu
>. Програма відкриє таке діалогове вікно: </para>
<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="generate_sql.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Після вибору типу бази даних відповідний запис SQL з’явиться у полі <guilabel
>Команди SQL для створення</guilabel
>; користувач зможе змінити значення у цьому полі або зберегти дані до текстового файла за допомогою натискання кнопки <guibutton
>Зберегти SQL</guibutton
>. У останньому випадку, базу даних доведеться створити за допомогою інструментів адміністрування, передбачених у самій системі керування базами даних. </para>
<para
>Якщо після коригування тексту у діалоговому вікні ви бажаєте, щоб програма &kappname; створила базу даних, вам слід заповнити інші поля діалогового вікна, як це раніше було докладно описано у розділі <link linkend="details.database.selectdatabase"
>Створення бази даних</link
> і натиснути кнопку <guibutton
>Створити таблиці</guibutton
>. Зауважте, що окрім випадку з SQLite, вам слід або включити відповідну інструкцію CREATE DATABASE як першу команду або спочатку виконати цю інструкцію поза межами &kappname; </para>
</sect3>

<sect3>
<title
>Попередження</title>
<para
>Вам слід бути дуже обережними з редагуванням визначень будь-якої з базових таблиць або областей перегляду (чиї назви починаються з «kmm»). Деякі зі змін, зокрема збільшення довжини поля цілих чисел, мають незначний вплив на роботу бази, але вам не слід вилучати поля або змінювати послідовність полів, щоб не зашкодити нормальній роботі &kappname; та убезпечити ваші дані від пошкодження. </para>
<para
>Хоча додавання або вилучення покажчиків може збільшити швидкодію програми, вам слід пам’ятати, що такі дії можуть призвести і до зовсім протилежних наслідків. Щоб досягти найкращої швидкодії, вам знадобляться певні знання зі структури роботи &kappname;. </para>
</sect3>

</sect2>

<sect2>
<title
>Шифрування</title>

<para
>У поточній версії шифрування вашої бази даних не підтримується. </para>
</sect2>
</sect1>
</chapter>
