Отношения в Strapi

В реляционной модели данных отношение - это фундаментальное понятие. В общем поэтому и модель называется реляционной от relation. Вся информация в реляционной базе данных, это набор таблиц с данными. Каждая таблица хранит строго определенный тип сущностей. В терминах реляционной модели каждая строка в  таблице, также запись или кортеж, столбец таблицы, также атрибут или поле, а сама таблица отношение. Мы же рассматриваем внешние отношения, связи между разными таблицами.

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

Strapi предлагает визуальный интерфейс для установки связей между разными сущностями - Content-Type Builder. Сущность - экземпляр определенного типа.  Например, есть тип - коллекция Posts, и созданная в этой коллекции/типе отдельная запись (Post).

Чтобы лучше понять как работают отношения, попробуем описать ключевые технические термины.

Cardinality - мощность отношений

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

Cardinality

Strapi позволяет настроить все возможные типы отношений.

1-to-1, 1..1

Один к одному. Например, пользователь и паспорт.

1-to-many, 0..n

Один ко многим. Например, книга и несколько авторов.

many-to-many, n..n

Многие ко многим. Например, студент может пройти несколько курсов, а курс проходят множество студентов.

Directionality - направленность отношений

Можно представить направленность, как поток, куда протекают данных в одну или обе стороны? Определение направленности вопрос дизайна схемы данных.

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

Directionality

Однонаправленные отношения обозначаются чертой со стрелкой на конце.

Unidirectional - однонаправленный

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

Bidirectional -  двунаправленный

Примером может служить отношение статьи и её автора и наоборот. Это в том случае если не предполагается тысяч и тысяч соединений.

Типы ассоциаций

Accotiations

Одиночный

Это простой случай, самый распространенный. Соединяются два разных типа сущностей, например статья и автор.

Полиморфный

Более сложный для обработки тип ассоциации. Применение полиморфных ассоциаций достаточно сложно для стандартных CMS.

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