Перейти до основного вмісту

Редагування зв’язків

Зв’язки малюють через контекстне меню полотна, панель інструментів полотна, швидкий пошук або сполучення клавіш — див. початок редагування.
На цій сторінці описано, що можна робити зі зв’язком, коли він уже існує, як за допомогою зіставлення стовпців завершити зв’язок на стовпцях, які вже є в дочірній таблиці, і як називаються стовпці зовнішнього ключа, які він додає.

Видалення​

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

Видалення зв’язку від products до reviews через його контекстне меню

Сполучення клавіш для цього немає, бо зв’язок не виділяється так, як таблиця чи нотатка: Delete і Backspace, які видаляють виділене, ніколи не видаляють зв’язок окремо — див. видалення таблиць і нотаток.
Зв’язки також видаляються разом із тим, що вони з’єднують: видалення таблиці видаляє всі зв’язки, приєднані до неї, а видалення стовпця — усі зв’язки, що його використовують.

Зміна типу​

Тип можна змінити через пункт Relationship Type у контекстному меню зв’язку.
Доступні чотири типи, а поточний позначено галочкою:

  • Zero One
  • Zero N
  • One Only
  • One N

Зміна типу зв’язку з Zero N на One Only, а потім на One N у його контекстному меню

Це ті самі чотири типи, з якими починають малювати зв’язок, кожен зі своїм сполученням клавіш, — див. початок редагування.

ON DELETE і ON UPDATE​

Дії задаються через пункти On Delete і On Update у контекстному меню зв’язку, між пунктами Relationship Type і Map Columns.
Кожен із них пропонує ті самі шість пунктів, а поточний позначено галочкою:

  • Not set
  • NO ACTION
  • CASCADE
  • SET NULL
  • SET DEFAULT
  • RESTRICT

Not set не записує жодної конструкції, тож застосовується типова поведінка самої бази даних. Новий зв’язок, намальований або створений через зіставлення стовпців, спочатку має для обох дій значення Not set, а вибір Not set пізніше скидає дію.
Ці дві дії незалежні: зміна однієї залишає іншу як є.
Лінія зв’язку показує, що задано, — див. як читати лінію зв’язку.
Зв’язок, скопійований і вставлений або продубльований разом зі своїми таблицями, зберігає обидві дії, а імпорт схеми SQL, DBML чи AML переносить дії, оголошені у файлі, — див. імпорт і експорт файлів.

Задання ON DELETE CASCADE і ON UPDATE RESTRICT для зв’язку від orders до order_items через його контекстне меню, мітка зв’язку з написом D U, а потім наведення вказівника, щоб прочитати обидві дії

Будь-яку дію можна вибрати незалежно від бази даних.
Дія, яку вибрана база даних не включає до своєї схеми SQL, має поруч приглушену примітку, як-от not in MySQL. Біля Not set такої примітки ніколи немає, а зміна бази даних оновлює примітки.
Дія з приміткою все одно зберігається у зв’язку: її показує лінія зв’язку, її зберігають JSON, DBML і AML, але схема SQL цієї бази даних пропускає відповідну конструкцію, тож застосовується типова поведінка бази даних.

Схема SQL записує такі дії, а решту пропускає:

База данихON DELETEON UPDATE
DatabricksNO ACTIONNO ACTION
MSSQLNO ACTION, CASCADE, SET NULL, SET DEFAULTNO ACTION, CASCADE, SET NULL, SET DEFAULT
MariaDBNO ACTION, CASCADE, SET NULL, RESTRICTNO ACTION, CASCADE, SET NULL, RESTRICT
MySQLNO ACTION, CASCADE, SET NULL, RESTRICTNO ACTION, CASCADE, SET NULL, RESTRICT
OracleCASCADE, SET NULLжодної
PostgreSQLусі п’ятьусі п’ять
SnowflakeNO ACTIONNO ACTION
SQLiteусі п’ятьусі п’ять

Схема SQL для Snowflake також записує коментар, що називає кожну пропущену дію, — див. посилальні дії.

Які дії записують цільові формати ORM генератора коду, залежить як від цільового формату, так і від вибраної бази даних — див. генератор коду.

Зіставлення стовпців​

Вікно зіставлення стовпців поєднує ключ батьківської таблиці зі стовпцями дочірньої таблиці, по одному рядку на кожен стовпець ключа.
Кожен рядок або використовує стовпець, який уже є в дочірній таблиці, або додає новий стовпець зовнішнього ключа, тож зв’язок може завершуватися на стовпцях, які вже існують.

Малювання зв’язку Zero N від members до orders, вибір Map to existing columns і зіставлення id з наявним стовпцем member_id

Відкрити його можна двома способами:

  • Під час малювання зв’язку через кнопку Map to existing columns біля дочірньої таблиці — див. створення зв’язків. Тоді кнопка Map додає зв’язок того типу, що малюється.
  • Через пункт Map Columns у контекстному меню зв’язку, щоб змінити стовпці наявного зв’язку. Тоді кнопка Save записує зміну. У редакторі в режимі лише для читання цей пункт не показується.

Підзаголовок діалогового вікна називає дві таблиці й тип зв’язку, як-от users → posts · One N. Тип тут показується, але не змінюється — скористайтеся зміною типу.

Список References визначає ключ, на який указує зв’язок: Primary Key зі стовпцями в тому порядку, в якому вони йдуть у таблиці, потім Unique: <column> для кожного стовпця з параметром Unique. Список показується, лише коли є більше ніж один варіант.
Унікальний індекс тут не вважається ключем, а стовпець із параметром Unique, що становить увесь первинний ключ, не показується двічі.
Вибір іншого ключа перебудовує рядки. Рядок зберігає свій вибір, поки вибраний стовпець лишається в дочірній таблиці.

Під заголовками Referenced column і Foreign key column кожен рядок показує стовпець ключа з його типом даних і список стовпців дочірньої таблиці, з якими його можна поєднати:

  • Pick a column залишає рядок порожнім.
  • New column: <name> додає новий стовпець зовнішнього ключа. Показана назва — це та, яку він отримає, як описано в розділі назви стовпців зовнішнього ключа, пронумерована з урахуванням стовпців дочірньої таблиці та інших рядків, що додають новий стовпець. Цей варіант не пропонується, коли назва була б порожньою, як-от для ключа без назви.
  • Кожен стовпець дочірньої таблиці у вигляді <name> (<data type>). Стовпець, уже вибраний в іншому рядку, має вигляд <name> (<data type>) · in use, і його не можна вибрати, тож жодні два рядки не мають спільного стовпця. Стовпець, який уже використовує інший зв’язок, усе одно можна вибрати, тож стовпець, як-от спільний tenant_id, може використовуватися в кількох зв’язках.

У вікні з кнопкою Map рядок спочатку заповнено, лише коли рівно один стовпець дочірньої таблиці без урахування регістру має назву, яку новий стовпець зовнішнього ключа для цього рядка отримав би до будь-якої нумерації _2, як-от users_id для id у таблиці users і member_id для member_id. Поки параметр Bracket має типове значення None, ураховується також назва, утворена з тієї частини назви таблиці з указанням схеми, що позначає таблицю, тож id у таблиці public.users поєднується з public.users_id або users_id. Для ключа з параметром Unique ураховується й власна назва стовпця ключа, тож vin поєднується з vin. Усі інші рядки спочатку мають значення Pick a column.
У вікні з кнопкою Save кожен рядок спочатку вказує на стовпець, який зв’язок використовує зараз. В обох випадках вибір іншого ключа в списку References заповнює порожні рядки цього ключа за тими самими назвами.

Коли тип даних вибраного стовпця відрізняється від того, який батьківський стовпець надає зовнішньому ключу, про це повідомляє примітка під рядком.
Коли синхронізацію типів даних у зв’язках увімкнено, а батьківський стовпець має тип даних, у примітці написано <column> becomes <type>, тобто тип, який запише зіставлення. Інакше в ній написано Types differ: <parent type> and <child type>, а стовпець зберігає свій тип.

Кнопка Map або Save лишається неактивною, поки щось заважає, а напис під рядками пояснює, що саме:

  • Pick a foreign key column for every referenced column: один із рядків досі порожній.
  • At least one column must reference a different column: рекурсивний зв’язок, у якому кожен рядок вибирає свій же батьківський стовпець.
  • These columns are already linked by another relationship: інший зв’язок між тими самими двома таблицями з’єднує саме ці стовпці.
  • <parent> has no key to reference: у вікні з кнопкою Map батьківська таблиця не має ні первинного ключа, ні стовпця з параметром Unique.

Кнопка Save також лишається неактивною, доки зіставлення не відрізнятиметься від поточного зіставлення зв’язку.
У вікні з кнопкою Save у рядку написано (removed), коли його стовпця вже немає в таблиці. Виберіть інший стовпець дочірньої таблиці або, якщо зник батьківський стовпець, виберіть ключ у списку References. У вікні з кнопкою Map рядок, вибраний стовпець якого видалено, повертається до значення Pick a column.

Зв’язок, батьківські стовпці якого не збігаються в точності з жодним із ключів батьківської таблиці, відкривається з додатковим варіантом наприкінці списку References — Current columns (not a key), який залишає ці стовпці як є. Коли батьківська таблиця взагалі не має ключа, це єдиний варіант, а список References не показується.
У такому разі напис The referenced columns are not a key of <parent> або <parent> has no key to reference, коли батьківська таблиця взагалі не має ключа, — це повідомлення, а не помилка: кнопка Save усе одно працює, тож можна змінити стовпці дочірньої таблиці й зберегти посилання.
Зв’язок, два списки стовпців якого не можна поєднати в пари, наприклад через різну довжину, показує рядки (invalid) і залишає кнопку Save неактивною, доки ви не виберете ключ у списку References або не додасте до батьківської таблиці первинний ключ чи стовпець із параметром Unique, якщо в неї немає жодного ключа.

Поки діалогове вікно відкрите, воно стежить за діаграмою, зокрема за змінами співавтора чи агента для програмування, і зберігає ваш вибір.
Якщо тим часом змінюються стовпці зв’язку або ключ, з яким вікно відкрилося, воно додає напис This relationship changed while the dialog was open.

Що записують кнопки Map і Save:

  • Map додає зв’язок, у якому On Delete і On Update мають значення Not set. Save змінює лише стовпці зв’язку, спрямовуючи його батьківський бік на ключ, вибраний у списку References, і зберігає його тип, а також дії ON DELETE і ON UPDATE.
  • Рядок New column додає стовпець у кінець дочірньої таблиці, як і малювання: NOT NULL, з назвою за його ключем, з типом даних, типовим значенням і коментарем ключа — див. ідентифікувальні зв’язки.
  • Вибраний стовпець ніколи не перейменовується, а його Not Null, первинний ключ, Unique, типове значення й коментар залишаються без змін. Його тип даних змінюється, лише коли увімкнено параметр Relationship DataType Sync і батьківський стовпець має тип даних: стовпець отримує тип, який батьківський стовпець надає зовнішньому ключу (для ключа типу serial — цілочисловий тип, як і для нового стовпця), а зміна поширюється далі зв’язками так само, як під час синхронізації.
  • Стовпець, який зіставлення перестає використовувати, лишається в дочірній таблиці й більше не позначається як зовнішній ключ, хіба що на ньому досі завершується інший зв’язок.
  • Усе, що записує одне натискання Map або Save, зокрема нові стовпці та зміни типів, є одним кроком відміни.

Чи є зв’язок ідентифікувальним і як малюється його кінець біля батьківської таблиці, визначається за зіставленими стовпцями дочірньої таблиці, як і для будь-якого зв’язку. Зіставлення зі стовпцями первинного ключа дочірньої таблиці одразу робить зв’язок ідентифікувальним, а зіставлення зі стовпцем, що допускає NULL, додає кільце на кінці біля батьківської таблиці — див. як читати лінію зв’язку.
Зовнішній ключ у схемі SQL посилається на вибраний вами ключ, як-от REFERENCES vehicle (vin) для ключа з параметром Unique.

Якщо на момент натискання Map або Save діаграма вже містить це зіставлення, бо співавтор чи агент для програмування встиг першим, нічого не записується.
Якщо вона змінилася так, що зіставлення більше не підходить, нічого не записується, а сповіщення повідомляє Couldn't map columns: the diagram changed.

Cancel, кнопка x, Escape або клацання на затемненій області поза діалоговим вікном закривають його, нічого не записуючи.
Затемнена область накриває весь редактор разом із панеллю інструментів, а відкритий оглядач лишається відкритим під нею.
Відкриття швидкого пошуку теж закриває діалогове вікно, як і вихід із вкладки ERD чи перехід редактора в режим лише для читання.
Ctrl + F (Windows/Linux) або ⌘ + F (Mac) також закриває його й ставить текстовий курсор у поле пошуку оглядача, відкриваючи оглядач, якщо він закритий. У редакторі, надто вузькому для показу оглядача, це сполучення все одно закриває діалогове вікно, але замість переміщення текстового курсора показує сповіщення — див. відкриття й закриття.
Якщо одну з його таблиць або сам зв’язок видалено, поки вікно відкрите, воно закривається зі сповіщенням, як-от Map Columns closed: the relationship was removed.
Поки вікно відкрите, сполучення клавіш полотна, відміна й повторення, а також копіювання й вставлення нічого не роблять.

Агент для програмування не має інструмента для зіставлення стовпців. Він повторно зіставляє зв’язок, видаляючи його за допомогою інструмента erd_remove_relationship, який зберігає його стовпці зовнішнього ключа, і малюючи його знову на наявних стовпцях за допомогою інструмента erd_link_columns, обидва в одному виклику erd_batch, — див. інструменти.

Зв’язки N:M​

Оскільки редактор базується на фізичній моделі, зв’язок N:M виражається через проміжну таблицю, як показано нижче.

Малювання зв’язків від products, а потім від tags до порожньої таблиці product_tags за допомогою ⌘ + ⌥ + 2 з додаванням product_id, а потім tag_id

Коли проміжна таблиця вже має свої ключові стовпці, як-от product_id і tag_id у таблиці product_tags, намалюйте кожен зв’язок за допомогою кнопки Map to existing columns і виберіть ці стовпці замість того, щоб додавати нові, — див. зіставлення стовпців. Якщо вони становлять первинний ключ проміжної таблиці, кожен зв’язок одразу стає ідентифікувальним.

Імпорт GraphQL, DBML чи AML сам створює проміжну таблицю.
Оголошення зв’язку «багато до багатьох» перетворюється на таблицю з назвою <left>_<right> і коментарем Junction table inferred from <left> <-> <right>, з’єднану з обома сторонами ідентифікувальними зв’язками.
Див. імпорт і експорт файлів.

Ідентифікувальні зв’язки​

Малювання зв’язку клацанням дочірньої таблиці або за допомогою кнопки Create new columns копіює кожен первинний ключ батьківської таблиці до дочірньої таблиці як стовпець зовнішнього ключа NOT NULL, тож новий зв’язок спочатку неідентифікувальний.
Копія отримує тип даних, типове значення й коментар ключа, але не Unique і не Auto Increment, а її назва утворюється так, як описано в розділі назви стовпців зовнішнього ключа.
Виняток щодо типу даних — ключ типу serial: його копія отримує цілочисловий тип, у якому serial зберігає значення. Для будь-якої бази даних smallserial і serial2 дають smallint, serial4 дає integer, а bigserial і serial8 дають bigint. Простий serial дає integer у PostgreSQL і bigint unsigned у MySQL та MariaDB, а для будь-якої іншої бази даних лишається serial.
Має значення лише повна назва типу без урахування регістру, тож serial(4) копіюється так, як записано. Тип, записаний великими літерами, дає великі літери: SERIAL дає INTEGER у PostgreSQL. Стовпець зовнішнього ключа, який у збереженій діаграмі вже має тип serial, зберігає цей тип.
Щоб зробити зв’язок ідентифікувальним, позначте ці стовпці зовнішнього ключа в дочірній таблиці як первинні ключі: виділіть їх усі й один раз натисніть Alt + K (Windows/Linux) або ⌥ + K (Mac) чи виберіть пункт Primary Key у контекстному меню таблиці, який має назву Primary Key on selected columns, коли виділено два стовпці або більше, — див. первинний ключ стовпця.

Перемикання первинного ключа для product_id за допомогою Alt + K, через що лінія зв’язку стає суцільною, а потім штриховою

Редактор сам підтримує цю відповідність.
Зв’язок є ідентифікувальним, поки всі його стовпці з боку дочірньої таблиці є первинними ключами, і стає неідентифікувальним, щойно один із них не є первинним ключем.

Назви стовпців зовнішнього ключа​

Під час малювання зв’язку кожен доданий стовпець зовнішнього ключа отримує назву за батьківським ключем, який цей стовпець копіює:

  • Назва ключа з одного слова, як-от id, ID або uuid, отримує спереду назву батьківської таблиці й символ підкреслення: id у таблиці products стає products_id.
  • Назва ключа з кількох слів, як-от member_id, userId або UserID, залишається без змін.
  • Однослівна назва ключа, яка без урахування регістру збігається з назвою самої таблиці, теж залишається без змін: currency у таблиці currency лишається currency. Ключ, який лише містить назву таблиці, однаково отримує префікс: username у таблиці user стає user_username.

Назва вважається одним словом, коли містить лише літери й цифри без зміни регістру.
Будь-який інший символ розбиває її на слова, тож _id, order no і order-no складаються з кількох слів.
Так само діє зміна регістру, яку визначають за правилами camelCase: мала літера, за якою йде велика (userId), дві великі літери, за якими йде мала (IDCard, IDs), або літера письма без регістру, як-от хангиль, кана чи ханьські ієрогліфи, поруч із літерою, що має регістр (회원ID).
Цифри не розбивають слово, тож id2 і SHA256 — це одне слово. Складене слово, записане в одному регістрі, теж є одним словом: memberid у таблиці members стає members_memberid.

Назва таблиці використовується так, як її записано, за винятком пробілів навколо неї: її регістр, внутрішні пробіли й крапки зберігаються, до однини вона не зводиться, а параметри Table Name Case і Column Name Case генератора коду не мають значення. Users із ключем ID дає Users_ID.
Кожен стовпець складеного ключа отримує назву окремо: orders із ключем (tenant_id, id) додає tenant_id і orders_id.

Назва, яка без урахування регістру вже є в дочірній таблиці, нумерується суфіксами _2, _3 тощо, і береться перший вільний номер.
Другий зв’язок від таблиці users із ключем id до тієї самої таблиці додає users_id_2, а рекурсивний зв’язок у таблиці members із ключем member_id додає member_id_2.
Стовпці одного складеного ключа так само нумеруються один відносно одного, а назва, що залишається без змін, займає своє місце першою: user із ключем (id, user_id) додає user_id для user_id і user_id_2 для id.

Якщо батьківська таблиця не має назви, назва ключа залишається без змін і в разі збігу нумерується, як будь-яка інша.
Ключ без назви дає стовпець зовнішнього ключа без назви.
Це стосується й первинного ключа, який редактор додає до батьківської таблиці, що його не має, якщо ви не дасте йому назву до клацання дочірньої таблиці.

Назви задаються під час малювання зв’язку. Подальше перейменування батьківської таблиці чи її ключа їх не перейменовує.
Рядки New column у зіставленні стовпців отримують назви за тими самими правилами, а список показує кожну назву ще до того, як ви її виберете.
Зв’язки, які з’являються з уже наявними стовпцями — унаслідок імпорту, вставлення, дублювання чи поєднання наявних стовпців у вікні зіставлення стовпців, — зберігають назви, які мають ці стовпці.
Агент для програмування, що додає зв’язок за допомогою інструмента erd_add_relationship, отримує ті самі назви й типи даних — див. інструменти.

Як читати лінію зв’язку​

  • Ідентифікувальний зв’язок малюється суцільною лінією, неідентифікувальний — штриховою.
  • Кінець біля дочірньої таблиці має символ кардинальності типу зв’язку: кільце й риска для Zero One, кільце й вороняча лапка для Zero N, дві риски для One Only та риска й вороняча лапка для One N.
  • Кінець біля батьківської таблиці — це кільце й риска, як у Zero One, коли хоча б один зі стовпців зовнішнього ключа допускає NULL, і дві риски, як у One Only, коли всі вони NOT NULL.
  • Наведення вказівника на лінію зв’язку підсвічує її разом зі стовпцями, які вона з’єднує в обох таблицях.

Почергове наведення вказівника на три лінії зв’язку, кожна з яких підсвічується разом зі стовпцями, які вона з’єднує

Зв’язок, для якого задано ON DELETE або ON UPDATE, має мітку поруч із кінцем біля дочірньої таблиці, як-от D:C U:R: D: і дія ON DELETE, потім U: і дія ON UPDATE, кожна лише тоді, коли її задано.
Дії скорочуються за нотацією erwin: C для CASCADE, R для RESTRICT, SN для SET NULL, SD для SET DEFAULT і NA для NO ACTION. Зв’язок, для якого не задано жодної з дій, мітки не має.
Мітка розташована з боку, віддаленого від дочірньої таблиці: над лінією, коли лінія зв’язку виходить із лівого чи правого боку цієї таблиці, і праворуч від лінії, коли та виходить зверху чи знизу, не перекриваючи символ кардинальності.
Вона малюється кольором лінії зв’язку на невеликому прямокутнику кольору тла полотна й підсвічується разом зі своєю лінією зв’язку. Мітки малюються поверх усіх ліній зв’язку, тож лінія, що перетинає мітку, проходить під нею.
Вона показує дію, збережену у зв’язку, незалежно від того, що записує вибрана база даних, тож ON DELETE SET DEFAULT і в MySQL показується як D:SD.

Наведення вказівника на лінію зв’язку, для якого задано будь-яку з дій, також показує підказку з повним записом конструкцій, по одній на рядок, як-от ON DELETE CASCADE і ON UPDATE RESTRICT.
Підказка з’являється, навіть коли мітку приховано.

Перехід до зв’язку підсвічує його: вибір рядка в папці Foreign Keys таблиці в оглядачі або рядка зовнішнього ключа в перегляді відмінностей малює його лінію зв’язку та мітку кольором наведення. У перегляді відмінностей підсвічується лінія зв’язку на кожній стороні, що містить цей зв’язок, тож доданий зовнішній ключ підсвічується лише на поточній стороні, а видалений — лише на збереженій.
Перехід виділяє лише дочірню таблицю з її стовпцями зовнішнього ключа, а клітинка у фокусі стоїть на першому з них; сам зв’язок, як і раніше, ніколи не виділяється. Про те, куди переміщується область перегляду, див. куди веде перехід.
Підсвічування зникає за наступного натискання лівою чи правою кнопкою на полотні, хай то порожнє місце, таблиця, нотатка, група таблиць чи лінія зв’язку, навіть якщо натискання не змінює виділення. Перехід до іншого рядка чи збігу пошуку в оглядачі теж його прибирає, як і перехід до іншого рядка в перегляді відмінностей — на кожній стороні, до якої веде цей рядок.
Панорамування середньою кнопкою або інструментом «Рука» не прибирає підсвічування, так само як згортання чи розгортання рядка в оглядачі чи перегляді відмінностей, зняття виділення клавішею Escape і перехід зі швидкого пошуку або через кнопку на картці режиму Flow зі значком зовнішнього посилання.
Підсвічування не зберігається, не потрапляє до історії змін, і співавтори його не бачать.

Лінії зв’язку на полотні ERD можна сховати параметром відображення Relationship, а лише їхні мітки — параметром відображення Referential Actions, який увімкнено за замовчуванням, — див. параметри відображення таблиць.
За масштабу 70% і менше, коли таблиці згортаються до назви, мітки не малюються.
Експорт зображення завжди малюється в масштабі 100%, тож він малює мітки за будь-якого масштабу полотна, якщо їх не приховує параметр відображення. Коли параметр Background вимкнено, прямокутник під кожною міткою теж прозорий.
Режим Flow на вкладці візуалізації малює лінії зв’язку навіть із вимкненим параметром Relationship, кожну як одну плавну суцільну сіру криву з тими самими позначками на кінцях, тож штрихова лінія, мітки, підказка, підсвічування після переходу та ортогональне прокладання, описані на цій сторінці, стосуються лише полотна ERD. Зв’язок таблиці із самою собою в режимі Flow теж вигинається навколо правого верхнього кута — див. прокладання ліній зв’язку.

Прокладання ліній зв’язку​

Лінії зв’язку прокладаються ортогонально.
Маршрут огинає таблиці, розташовані між двома його кінцями, замість того щоб перетинати їх, а його кути заокруглені.
Кожен кінець виходить зі своєї таблиці коротким прямим відрізком, перш ніж повернути, тож дві таблиці на невеликій відстані одна від одної, у яких кінці лінії зв’язку лежать на одній прямій, з’єднуються однією прямою лінією, а не обхідним шляхом.
Маршрути, що виходять з одного боку таблиці, розносяться в окремі коридори, щоб не накладатися один на одного.
Оминаються лише таблиці: лінія зв’язку може перетинати нотатку чи рамку групи таблиць і малюється над групами таблиць та під таблицями й нотатками.

Зв’язок таблиці із самою собою малюється однією кривою навколо правого верхнього кута таблиці: кінець біля батьківської таблиці виходить із верхнього боку, а кінець біля дочірньої таблиці входить у правий бік.
Наступні рекурсивні зв’язки тієї самої таблиці розташовуються ззовні першого, тож їхні криві не перетинають ні одна одну, ні таблицю.

Налаштовувати тут нічого не потрібно.
Маршрути автоматично перераховуються щоразу, коли щось на полотні переміщується або змінює розмір, тож їх ніколи не доводиться виправляти вручну.

Перетягування таблиці members вниз і назад, поки лінія зв’язку від orders перемикається між проходженням праворуч від categories і обходом її зліва, з усіма заокругленими кутами