Обновить

Три задачи требований к данным

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8.4K
Всего голосов 2: ↑2 и ↓0+2
Комментарии5

Комментарии 5

Первичные ключи помечаю 🔑, внешние — 🔐.

Вероятно, вы работали только с очень простыми и высоконормализованными схемами, не имеющими естественных ключей. Но если, к примеру, первичный ключ является естественной комбинацией из трёх полей, причём два из них являются внешними ключами в другие таблицы, то такие простые пометки только запутают. А как в такой схеме описывать функциональные внешние ключи, не имеющие представления в виде вычисляемых полей, и вовсе непонятно.

Вообще в этой схеме нет места много чему. Например, совершенно непонятно, где описываются триггеры и вообще хранимые объекты. Или как описывать DEFERRED бизнес-правила.

Составной первичный ключ — несколько полей с 🔑. Если поле одновременно является частью первичного ключа и внешним ключом — ставлю оба: 🔑🔐. В моей практике такие случаи встречаются, и нотация с этим справляется.

По триггерам и хранимым объектам — в моих проектах они не используются, поэтому в шаблоне их нет. Как и написал в статье, шаблоны заточены под мой контекст — PostgreSQL, достаточно стандартные реляционные схемы. Для проектов со сложной логикой на уровне БД шаблон нужно расширять.

Если поле одновременно является частью первичного ключа и внешним ключом — ставлю оба: 🔑🔐. В моей практике такие случаи встречаются, и нотация с этим справляется.

Гм... пример.

field0 🔑

field1 🔑🔐

field2 🔑🔐

Понятно, что тут составной ключ. Но вот теперь скажите - у меня один внешний ключ из 2 полей или 2 внешних ключа? По вашей нотации пока получается, что оба варианта дают одно и то же показанное мной описание.

В таблице эти обозначения — маркеры, для быстрого чтения. Мы понимаем, что они участвуют во внешнем ключе. Но как конкретно — описывается в отдельном разделе "Ключи и связи". На самом деле, не могу утверждать, насколько это понятно и не запутывает ли разработчиков. С таким на практике не сталкивался. Но всегда есть уточнение в нижнем разделе, которое дает понять, как именно ключи связаны.

То есть, если у нас будет составной внешний ключ, мы запишем как-то так:

## Ключи и связи

* 🔑 Первичный ключ: (field0, field1, field2)
* 🔐 Внешние ключи:
  * (field1, field2) → other_table.(id1, id2)

А если они разные, то:

* 🔐 Внешние ключи:
  * field1 → table_a.id
  * field2 → table_b.id

Ааа, вот оно чё, Михалыч...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации