# База данных

## 0. Введение

TODO

## 1. Файлы с исходным кодом

TODO

## 2. Форматирование

### 2.1. Регистр ключевых слов

Ключевые слова записываются в нижнем регистре.

```sql
    -- Плохо
    SELECT * FROM <table>;

    -- Хорошо
    select * from <table>;
```

## 3. Использование возможностей языка

TODO

## 4. Правила именования

### 4.1. Общие правила для всех идентификаторов

a. Используются общие правила именования всех идентификаторов из общих стандартов разработки, [п. 5.1](https://eigenspace.gitbook.io/dev-standards/common#51-------).

b. Для исключения проблем с использованием разного регистра и специальных символов в качестве разделителей заключать идентификатор в двойные кавычки. Они являются техническим средством позволяющим задать требуемое имя и не влияют на отображение имён при просмотре базы данных.

c. Основные идея, которые стоят за именованием объектов базы данных - это получить сквозные правила именования от базы данных до приложения.

### 4.2. Правила для идентификаторов каждого типа

#### 4.2.1. Имена сущностей (таблиц)

Правила именования сущностей соответствуют [правилам именования классов](https://eigenspace.gitbook.io/dev-standards/scripts#421----). Например, `"FinancialInfo"`, `"Company"`.

При именовании сущностей (таблиц) используется именно единственное число с тем, чтобы сделать акцент именно на состав сущностей и их взаимосвязи. Тем самым упростить интеграцию приложения с базой данных, которое оперирует именно понятиями классов и объектов.

#### 4.2.2. Имена полей сущности (таблицы)

a. Правила именования полей соответсвуют [правилам именования полей классов](https://eigenspace.gitbook.io/dev-standards/scripts#425--naming-convention---).

b. Поле, являющееся идентификатором сущности, именуется `id`.

c. Поле, являющееся ссылкой на другую сущность, т.е. внешним ключом, именуется `<сущность>Id`. Например, сущность связана с сущностью `Company`, тогда поле должно называться `"companyId"`.

#### 4.2.3. Правила именования индексов

Название индекса состоит из следующих групп:

* префикс, представляющий собой тип индекса: обычный (idx, index)

  или уникальный (udx, unique index)
* сущность, которой этот индекс принадлежит
* поля сущности

Группы именуются в соответствии с правилами именования для данного типа идентификатора. Префикс добавляется без разделителя, поля сущности заключатся в квадратные скобки и между собой разделяются запятой.

```sql
    -- Обычный индекс
    "idxFinancialInfo[dividendYield,revenue]"

    -- Уникальный индекс
    "udxInstrument[ticker,exchange,country]"
```

#### 4.2.4. Правила именования ограничений/связей (constraint'ов)

a. Название ограничения состоит из следующих групп:

* префикс, представляющий собой тип ограничения: первичный ключ (pk, primary key)

  или внешний ключ (fk, foreign key)
* сущность, на поля которой налагается ограничение
* \[необязательное] поля сущности, на которую налагаются ограничения

Группы именуются в соответствии с правилами именования для данного типа идентификатора. Префикс добавляется без разделителя, поля сущности заключатся в квадратные скобки и между собой разделяются запятой.

b. Поле сущности для первичного ключа не указывается, т.к. оно всегда `id`.

c. Связываемая внешним ключом сущность не указывается, т.к. её описание уже представлено полем, на которое ссылкой накладывается ограничение.

```sql
    -- Первичный ключ (поле `id` сущности FinancialInfo)
    "pkFinancialInfo"

    -- Внешний ключ (связь с сущностью Instrument по первичному ключу id)
    "fkFinancialInfo[instrumentId]"
```

#### 4.2.5. Правила именования базы данных

В качестве названия базы данных должно использовать одно слово в нижнем регистре. Например, `investment`

#### 4.2.6. Правила именования схемы

В качестве названия схемы базы данных должно использовать одно слово в нижнем регистре. Например, `portfolio`. Тогда обращение к сущности внутри схемы будет выглядеть: `portfolio."PortfolioLine"`.

#### 4.2.7. Правила именования пользователей

В качестве имени пользователя должно использовать одно слово в нижнем регистре.
