.. raw:: latex

  \appcount

.. _logical_relationship_erd:

Логические связи ER-диаграмм
================================

В ER-диаграмме связь между таблицами может быть физической или логической.

Физическая связь соответствует внешнему ключу в базе данных. При создании такой связи 
редактор формирует соответствующее ограничение внешнего ключа (SQL-оператор ``ALTER TABLE`` для добавления внешнего ключа).

Логическая связь существует только в ER-модели. Она отображает предполагаемое отношение 
между таблицами и полями, но не создаёт внешнего ключа или другого ограничения в базе данных.

Основные различия между физическими и логическими связями:

.. tabularcolumns:: |>{\arraybackslash}\X{7}{17}|>{\arraybackslash}\X{5}{17}|>{\arraybackslash}\X{5}{17}|
.. list-table::
   :class: longtable
   :header-rows: 1

   * - Свойство
     - Физическая связь
     - Логическая связь
   * - Создаёт внешний ключ
     - Да
     - Нет 
   * - Формирует SQL ``ALTER TABLE``
     - Да
     - Нет
   * - Хранится в `.eqd`
     - Да
     - Да
   * - Отображается на диаграмме
     - Да
     - Да; по умолчанию точечной линией
   * - Может быть импортирована из JSON
     - Нет
     - Да

.. rubric:: Импорт логических связей из JSON
  

Логические связи можно добавить на ER-диаграмму путём импорта из JSON-файла. 
При импорте редактор создаёт логические связи между указанными таблицами и полями. 
Эти связи отображаются на диаграмме точечной линией, но не создают внешних ключей или других ограничений в базе данных.

Файл импорта должен содержать корректный JSON в кодировке UTF-8. 
Корневым элементом должен быть массив. Каждый элемент массива описывает одну логическую связь.

Пример:

.. code-block::

  [
    {
      "name": "CUSTOMER_ORDER",
      "sourceTable": "ORDERS",
      "sourceColumn": "CUSTOMER_ID",
      "targetTable": "CUSTOMERS",
      "targetColumn": "ID" 
    },
    {
      "sourceTable": "ORDER_ITEMS",
      "sourceColumn": "ORDER_ID",
      "targetTable": "ORDERS",
      "targetColumn": "ID" 
    }
  ]


Логическая связь задаётся направлением от исходной таблицы к целевой. 

Поля объекта:

- ``"name"`` - отображаемое имя связи (необязательное поле);
- ``"sourceTable"`` - ссылающаяся (исходная) таблица;
- ``"sourceColumn"`` - ссылающееся (исходное) поле;
- ``"targetTable"`` - целевая таблица;
- ``"targetColumn"`` - целевое поле.


Все значения перечисленных полей должны быть строками. Лишние поля
в объектах игнорируются.

Поле ``"name"`` не участвует в определении уникальности связи. 
Две связи считаются одинаковыми, если совпадают все четыре 
конечные точки: исходная таблица, исходное поле, целевая таблица и целевое поле.

Для известных системных объектов Firebird (``RDB$...`` и ``MON$...``) редактор
содержит встроенный набор логических связей. Такие связи автоматически отображаются 
на диаграмме, если оба объекта, участвующих в связи, присутствуют на диаграмме. 
Эти связи не создают ограничений в базе данных и не предназначены для удаления пользователем.