<?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, &kmymoney; поддерживает хранение данных в реляционной базе данных. Одним из преимуществ использования этого общепризнанного формата является возможность просмотра данных с помощью графических интерфейсов, в частности <trademark
>OpenOffice.org</trademark
> и <trademark
>LibreOffice</trademark
>, а также их преобразования в формат, работу с которым ещё не поддерживает &kmymoney;. Кроме того, даже поверхностное знакомство с SQL (Structured Query Language, структурированный язык запросов) позволит упростить экспорт данных во внешнюю программу (например, в приложение для работы с бюджетами). </para>
<para/>
</sect2>

<sect2
><title
>Подготовка</title>

<para
>Для получения доступа к базе данных &kmymoney; использует модуль SQL, созданный компанией &Qt; Software как часть программной библиотеки &Qt;. В этом модуле предусмотрен набор драйверов, который обеспечивает поддержку работы с рядом различных систем баз данных. В том числе, доступны драйверы для наиболее популярных систем с открытым исходным кодом: <trademark
>MySQL</trademark
>, SQLite (только для версия 3 и последующих версий) и PostgreSQL. Также в модуле предусмотрена поддержка «тяжёлых» промышленных систем, в частности <trademark class="registered"
>Oracle</trademark
> и IBM <trademark class="registered"
>DB2</trademark
>. </para>

<para
>За исключением SQLite, эти системы используют клиент-серверную модель, в которой «клиентское» программное обеспечение установлено на «пользовательском» компьютере, в то время как сервер установлен на том же компьютере, что и сама база данных (а она может быть расположена на любом из компьютеров сети). Как правило, при работе с приложениями учёта личных финансов «пользовательский» компьютер выступает в роли как клиента, так и сервера. Следовательно, первое, что потребуется сделать после выбора системы базы данных, это установить клиентское и (скорее всего) серверное программное обеспечение. </para>

<para
>Помимо собственно программного обеспечения базы данных, следует также установить и соответстующий модуль драйвера &Qt;. В большинство дистрибутивов входят модули драйверов для наиболее популярных баз данных. Если же модуль отсутствует, выполните поиск на <ulink url="https://www.qt.io/"
>веб-сайте программного обеспечения &Qt;</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
>При первом использовании базы данных и в дальнейшем (тогда, когда меняется компоновка базы данных) потребуются права (привилегии) на создание и изменение таблиц и областей просмотра (подробнее об этом в следующем абзаце). В разных системах права или привилегии могут называться по-разному, но обычно это что-то наподобие <literal
>CREATE</literal
> и <literal
>ALTER</literal
>. Для нормальной работы необходимы права на чтение и создание записей; в SQL эти права обычно определяются ключевыми словами <literal
>SELECT</literal
>, <literal
>INSERT</literal
>, <literal
>UPDATE</literal
> и <literal
>DELETE</literal
>. </para>
</sect3>

<sect3>
<title
>Создание таблиц</title>

<para
>Во время первого доступа к базе данных &kmymoney; выполнит попытку создания необходимых программе структур. Для обеспечения максимальной совместимости между базами данных различных типов программа будет использовать только определённое подмножество общих типов данных. Но возможны случаи, когда конкретные типы не поддерживаются. Для таких случаев предусмотрена возможность генерации кода SQL, который требуется для создания таблиц. Этот код затем возможно изменить необходимым образом и использовать для создания таблиц вне программы &kmymoney;. Если пользователь окажется в подобной ситуации, помощь будет возможно получить в списке рассылки &devlist;. Более подробные сведения доступны в разделе <link linkend="details.database.generatesql"
>Создание базы данных вручную</link
>. </para>
</sect3>
</sect2>

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

<para
>Воспользуйтесь &kmymoney; для открытия или импорта существующего файла данных или создайте новый файл. Затем выберите пункт меню <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Сохранить как...</guimenuitem
></menuchoice
>. Будет показан следующий диалог: </para>

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

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

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

<para
>В этом поле представлен список всех драйверов SQL &Qt;, установленных в системе. Выберите необходимый драйвер. Если драйвер отсутствует в списке, потребуется установить его. Ознакомьтесь с документацией дистрибутива или посетите <ulink url="https://www.qt.io/"
>веб-сайт программного обеспечения &Qt;</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
>Название базы данных по умолчанию — <literal
>KMyMoney</literal
>, но возможно выбрать и другое название. &kmymoney; поддерживает создание баз данных не всех типов; в этом случае следует заранее создать базу данных с помощью соответствующей процедуры. Тем не менее, с помощью &kmymoney; обычно возможно создать все необходимые структуры таблиц. Если это окажется невозможным, пользователю следует создать их самостоятельно. Более подробные сведения доступны в разделе <link linkend="details.database.generatesql"
>Создание базы данных вручную</link
>. </para>
</sect3>

<sect3
><title
>Имя хоста</title>
<para
>В случае обычного пользователя, предложенное по умолчанию имя <quote
>localhost</quote
> (локальный компьютер, на котором в данный момент работает пользователь) изменять не потребуется. Если же пользователь работает с базой данных по сети, следует указать имя подключённого хоста. </para>

</sect3>

<sect3>
<title
>Имя пользователя и пароль</title>
<para
>Проверьте права доступа, заданные для базы данных, или обратитесь к администратору базы данных для получения корректных значений. Указанный пользователь должен иметь право на выбор, вставку, обновление и удаление записей. Если имя пользователя совпадает с именем для входа в систему, пароль обычно не требуется. </para>
</sect3>
</sect2>

<sect2>
<title
>Доступ к данным</title>

<sect3>
<title
>Конструктор таблиц</title>

<para
>Чтобы получить доступ к данным в &kmymoney;, выберите пункт меню the <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Открыть базу данных...</guimenuitem
></menuchoice
>. Будет открыт диалог, похожий на упомянутый ранее. </para>

<note>
<para
>Если база данных была создана путём открытия файла и последующего его сохранения с помощью функции <guimenuitem
>Сохранить как...</guimenuitem
> (как описано выше), любые последующие изменения данных сохраняются только в базе данных, а не в файле. Это означает, что файл возможно использовать как резервную копию или снимок данных на определённый момент времени. Чтобы создать новую резервную копию, откройте базу данных, выберите пункт меню <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Сохранить как...</guimenuitem
></menuchoice
> и укажите название файла. Затем обязательно откройте базу данных повторно, чтобы программа &kmymoney; не сохраняла изменения в файл. </para>
</note>

<para
>Чтобы получить доступ к данным в других форматах, необходимо иметь представление о том, каким образом они хранятся в реляционных базах данных. Практические навыки работы проще всего всего получить, открыв базу данных в графическом интерфейсе, например, в <trademark
>OpenOffice.org</trademark
>. Будет показан список различных таблиц, которые составляют базу данных, что позволяет увидеть компоновку каждой из них. </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
><literal
>kmmInstitutions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.institutionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Счета «родительский/дочерний»</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.parentId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операции и разбивки (см. примечание 1)</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.transactionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Счета и разбивки</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.accountId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Контрагенты и разбивки</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPayees.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.payeeId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Графики платежей и операции</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSchedules.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операции и валюты</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
><literal
>Счета и ценные бумаги (см. примечание 2)</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Ценные бумаги и котировки</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> или <literal
>kmmPrices.toId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Котировки валют</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> или <literal
>kmmPrices.toId</literal
></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
>Денежные суммы и стоимость акций отображаются как в формате «числитель/знаменатель», так и как поле с суффиксом названия «<literal
>Formatted</literal
>» (в том виде, в котором они будут показаны на экране). </para>

<para
>Аналогичным образом, некоторые поля, такие как тип счёта, отображаются как в виде числового кода, так и в поле с суффиксом названия «<literal
>String</literal
>» (в формате и на языке программы). </para>
</sect3>

<sect3>
<title
>Обновление данных</title>

<para
>Наличие данных в общепризнанном формате предоставляет возможность изменять их вне приложения &kmymoney;. НЕ ДЕЛАЙТЕ ЭТОГО, если не обладаете всеми необходимыми знаниями, и сначала всегда сохраняйте резервную копию данных. Если при изменении произойдёт ошибка, к данным будет невозможно получить доступ с помощью &kmymoney;; возможна даже полная потеря данных! </para>
</sect3>

<sect3>
<title
>Сохранённые запросы</title>

<para
>Большинство систем работы с базами данных позволяют сохранять часто используемые запросы и процедуры. Иногда они могут храниться внутри самой базы данных как таблицы или другие объекты. Как следует из приведённого ранее примера, названия всех используемых &kmymoney; таблиц начинаются с букв в нижнем регистре: «<literal
>kmm</literal
>». Этот стандарт поддерживается и далее: обновляются только те таблицы, названия которых начинаются с этих букв. Следовательно, если запросы и процедуры будут названы иначе, никаких проблем не возникнет. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql">
<title
>Создание базы данных вручную</title>
<note>
  <para
>В этом разделе рассказывается о расширенных возможностях управления базами данных. Обычные пользователи программы могут просто пропустить его. </para>
</note>

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

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

<para
>После выбора типа базы данных соответствующая запись SQL появится в текстовом поле <guilabel
>Создание сценария SQL</guilabel
>; пользователь может внести изменения или сохранить данные в текстовой файл нажатием кнопки <guibutton
>Сохранить запрос SQL</guibutton
>. В последнем случае базу данных придётся создать с помощью функций администрирования, предусмотренных в самой системе базы данных. </para>
<para
>Если после корректировки текста в диалоговом окне требуется, чтобы программа &kmymoney; создала базу данных, следует заполнить остальные поля диалога, как это было ранее подробно описано в разделе <link linkend="details.database.selectdatabase"
>Создание базы данных</link
>, и нажать кнопку <guibutton
>Создать таблицы</guibutton
>. Обратите внимание, что (за исключением случаев использования SQLite) потребуется либо включить соответствующую инструкцию <literal
>CREATE DATABASE</literal
> как первую команду, либо сначала выполнить эту инструкцию вне программы &kmymoney;. </para>
</sect3>

<sect3>
<title
>Предупреждение</title>
<para
>Следует очень внимательно отнестись к редактированию определений любых базовых таблиц или областей просмотра (их названия начинаются с букв «<literal
>kmm</literal
>»). Некоторые изменения (например, увеличение длины поля целых чисел) не оказывают заметного влияния, но не следует удалять или изменять последовательность записей полей: это может привести к сбою в работе &kmymoney; или повреждению данных. </para>
<para
>При добавлении или удалении индексов производительность может возрасти, но следует учитывать, что возможен и обратный эффект. Знание принципов внутренней работы &kmymoney; может помочь достичь оптимальной производительности в этих обстоятельствах. </para>
</sect3>

</sect2>

<sect2>
<title
>Шифрование</title>

<para
>В текущей версии программы шифрование данных в базе данных не поддерживается. </para>
</sect2>
</sect1>
</chapter>
