Полиморфные отношения что это такое простыми словами
Полиморфные связи для самых маленьких
Недавно, делая очередной функционал на одном из проектов, я столкнулся с немного необычными связями в реляционных СУБД, у которых, как оказалась позже, есть замысловатое название — Полиморфные связи. Что это такое, как и где их применять, я попытаюсь объяснить в данной статье.
Тема полиморфных связей уже поднималась не раз на Хабре («Rails и полиморфные связи», «Полиморфные сквозные ассоциации в Ruby on Rails», «Полиморфные связи»), но поднималась она в контексте Ruby, и для тех, кто уже имеет какой-то опыт в проектировании БД. Новичкам же (мне было), мало что понятно из тех статей, поэтому в данной статье я попытаюсь рассказать всё на пальцах, абстрагируясь от языка, разве что немного задену ORM популярных фреймворков в вебе.
Всем понятны обычные «взаимоотношения» табличек в реляционных БД: один-к-одному, один-ко-многим, многие-ко-многим. А если не понятны, то вот вам простые примеры их реализации.
Один-к-одному. Одной записи из первой таблицы, соответствует только одна запись из второй таблицы. Тут всё просто. Самый распространенный пример — таблица user и user_profile (Каждому пользователю, соответствует один профиль).
Один-ко-многим. Связь строится таким образом, что каждой записи в одной таблице может соответствовать несколько записей из другой таблицы. Пример — таблица articles (статьи), таблица comments (комментарии). К одной статье может быть оставлено множество комментариев.
Многие-ко-многим. Связь реализуется, когда одной строке из одной таблицы может соответствовать несколько записей из другой и наоборот. Хороший пример — имеется таблица статей (articles), имеется таблица тегов (tags), связываются они через промежуточную таблицу (pivot table или junction table) tags_articles, в которой есть article_id, tag_id.
Вроде, всё тут просто и понятно.
Откуда же взялись какие-то полиморфные связи, если и так предыдущие связи вполне логичны и как будто, не требуют дополнений?
Предыдущие связи (один-к-одному, один-ко-многим, многие-ко-многим), создаются для статичных сущностей из таблиц, на которые можно навесить ограничения (constraints) предоставляемые СУБД.
Вернемся к примеру связи один-ко-многим.
В таблице comments article_id — это id статьи из таблицы articles. Всё очевидно. Но! Что если, завтра у нас появляется необходимость создать таблицу news (новостей) и для нее тоже нужно добавить функционал комментариев?!
При известных нам типах связей между таблицами, варианта появляется два:
1) Создать новую таблицу comments (напр. comments_news) с идентичной структурой, как у таблицы comments, но вместо article_id, поставить news_id.
2) В существующую таблицу comments добавить еще один столбец news_id рядом с article_id.
В обоих случаях получается как-то коряво. Если завтра нужно будет добавить функционал комментариев к еще одной — третьей таблице (напр. к постам пользователей или к картинкам), нам придётся создать еще одну таблицу или третье поле в существующей таблице? Пятое-десятое? Не то… Тут на помощь и приходят полиморфные связи.
Суть полиморфных связей
Полиморфные связи — это динамические связи между таблицами с использованием типа сущности.
Чтобы было понятно, поменяем немного наши таблицы и сделаем между ними полиморфные связи.
Наша еще одна таблица — news:
И меняем таблицу comments, чтобы стало, ровно!
Суть полиморфных связей становится ясна, при просмотре таблицы comments — entity_id — id какой-то сущности, к которой мы оставляем комментарий, entity_type — тип этой самой сущности. Ни entity_id, ни entity_type — заранее неизвестны, поэтому эти связи можно назвать динамическими.
Использовать полиморфные связи стоит тогда, когда у нас появляется две и более таблицы, у которых будет связь один-ко-многим с какой-то другой одной и той же таблицей (articles-comments, news-comments, posts-comments и т.д.). Если же, у вас есть связи только между 2 таблицами и больше не предусматривается, полиморфные лучше заменить на обычные один-ко-многим.
Полиморфные связи могут быть реализованы, и как многие-ко-многим.
Показывать таблицы с данными не имеет смысла, покажу лишь примерную структуру.
articles:
id — integer
text — text
posts:
id — integer
text — text
tags:
id — integer
name — string
tags_entities
tag_id — integer
tag_entity_id — integer
tag_entity_type — string (post|article)
Минусы полиморфных связей
Не всё так идеально, как могло бы показаться на первый взгляд. В силу своей динамической природы полиморфных связей, между полями связуемых таблиц, нельзя проставить связи внешних ключей (foreign key) используя СУБД, а тем более и ограничения (constraints) на изменение или удаление записей. Это, собственно самый большой минус полиморфных связей. Придется, либо писать свои триггеры (процедуры или еще что) для самой СУБД, либо, что чаще делают, переложить работу по синхронизации строк и накладыванию ограничений между таблицами на ORM и язык программирования.
Второй, уже менее значительный минус полиморфных связей состоит в типе сущности. Необходимо как-то описать какой тип, какой таблице принадлежит. Это может быть не очевидно, если например название какой-то таблицы изменилось или если вы задали тип сущности цифрами. Решить эту проблему можно, например создав отдельную таблицу, или прописав в коде проекта, ассоциативный массив с сопоставлением типа и сущности.
Работа ORM с полиморфными связями
Следует сказать, что современные фреймворки и их ORM без особых сложностей, способны работать с данными связями.
Например, как уже говорилось выше, Ruby on Rails поддерживает их из коробки. Php-фреймворк Laravel, также имеет в своей реализации ORM для таких типов связей удобные методы (morphTo, morphMany и т.д.), а как тип сущности использует полное название класса модели. Во фреймворке Yii2, нет из коробки каких-то специфичных методов для такого рода связей, но они могут быть реализованы через обычные методы hasOne, hasMany с дополнительными условиями при прописывании связей.
Из всего вышесказанного, новичкам стоит обратить внимание на то, когда использовать полиморфные связи. Не стоит их пихать направо и налево, из проекта в проект, только потому что это круто. Нужно немного прикинуть наперед, а появятся ли завтра новые таблицы, новые сущности с одинаковым функционалом и требованиями, которые можно было бы вынести и сделать динамическими, и исходя от ответа проектировать свои БД.
Полиморфные отношения
В этом уроке я помогу вам понять концепцию полиморфных отношений в Laravel. Обещаю, это будет весело, так как будем рассматривать их на примере пиццы.
Основые типы Отношений
Прежде чем рассмотрим Полиморфизм, давайте быстренько пробежимся по трем основным типам отношений:
Один к одному
Эти отношения связывают одну вещь с другой. Одна пицца имеет один тип топпинга (начинки) и наоборот — один топпинг может быть у одной пиццы.
Базовая структура таблиц, для отношения Один-к-Одному будет такой:
Конечно, пицца с одним топпингом это смешно. В большинстве случаев в пицце их будет много. Это подводит нас к следующим отношениям.
Один ко многим
Эти отношения связывают одну вещь со многими другими. Согласно нашему сценарию, одна пицца может иметь много топпингов, и, наоборот, множество топпингов могут быть в одной пицце.
Таблицы БД для этих отношений:
Похоже на таблицы предыдущих отношений? Так и есть!
Эти отношения имеют такую же структуру, но есть небольшое отличие. В отношениях Один-к-Одному внешний ключ pizza_id уникален ( unique ). В отношениях Один-ко-Многим» внешний ключ не уникален, что позволяет пицце иметь много топпингов.
Многие ко многим
В этих отношениях мы используем сводную (промежуточную) таблицу для того, чтобы определить отношения между пиццей и ее топпингами.
Структуру таблицы отношений:
Это три наиболее распространенных типа отношений.
Теперь, когда мы с этим разобрались, то перейдем к полиморфным отношениям.
Полиморфизм
Что если нужно добавить в наш сценарий новый продукт? Например, горячие сандвичи! И чтобы они использовали те же топпинги, что и пицца, то как это оформить в нашей базе данных?
Вот тогда мы и призываем на помощь Полиморфизм!
У Полиморфных Отношений есть сводная таблица, похожая на таблицу отношений «Многие-ко-Многим», но, она имеет дополнительное поле, определяющее тип продукта питания.
Структура таблиц для полиморфных отношений:
В этих отношениях продукт питания (пицца или сандвич) не указывается напрямую, в то время как в отношениях «Многие-ко-Многим» в таблице pizza_toppings прямо указана пицца.
Важно помнить, что таблицы в полиморфных отношениях могут быть «морфированными» или динамическими.
Как работает полиморфизм
Полиморфные отношения работают с использованием сводной таблицы с дополнительным полем, определяющим, на какую таблицу должен ссылаться внешний ключ.
В неполиморфных отношениях внешние ключи ссылаются на primary ID в конкретной таблице. С другой стороны, внешний ключ в полиморфной сводной таблице может ссылаться на множество таблиц.
Пример полиморфизма
Полиморфные отношения доступны в любом языке, использующем реляционную базу данных. Я покажу вам несколько примеров кода для Laravel с использованием этих таблиц:
Во-первых, мы создадим новую Eloquent-модель Pizza с отношением toppings() :
Чтобы получить топпинги для пиццы, напишем следующий код:
Далее, мы также можем получить обратные отношения для модели Topping :
И тогда мы могли бы попросить все пиццы и сандвичи с определенным топпингом:
Добавление полиморфных связей может сделать ваше приложение более эффективным, гибким и простым в программировании.
Заглянем глубже
Полиморфные отношения также можно разделить на три категории, которые мы рассмотрели ранее. Они могут быть «Один-к-Одному», «Один-ко-Многим» и «Многие-ко-Многим».
Пример отношения, который мы рассмотрели в этом уроке, это Полиморфные Отношения «Многие-ко-Многим».
Если вы хотите узнать больше о полиморфных отношениях, то обязательно ознакомьтесь с документацией Laravel:
Вывод
Надеюсь, этот урок помог вам разобраться с полиморфными отношениями.
Лучший способ изучить какую-либо концепцию — просто погрузиться в неё и начать применять. После внедрения полиморфизма в несколько проектов вы начнете понимать все больше и больше. В конце концов, концепция использования «Полиморфных отношений» будет похожа на многослойную пиццу 😉
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
Полиаморные отношения — эволюционный взгляд на чувства или разрушающаяся тенденция
Полиамория подразумевает любовные отношения с несколькими людьми одновременно. Однако, это понятие далеко от распущенности и беспорядочных половых связей. Со стороны морали явление осуждается. А вы знали, что некоторые люди практикуют полиаморию, но сами не догадываются об этом?
Что такое полиамория
Слово полиамория значит этическую систему, допускающую любовные отношения с другими людьми при обоюдном согласии партнеров [англ. polyamory ← греч. πολυ — множественный, обширный + лат. amor — любовь] (толковый словарь современного русского языка Дениса Хворостина).
Простыми словами, полиамория – это одновременные чувства сразу к нескольким людям. Практически все мы их испытывали еще в школе, детском саду или в летнем лагере.
Например, девочке Ане нравятся два мальчика, Петя, который классно играет в футбол, и Антон, который увлекается рок-музыкой, и она долго не может решить, кто же из них ей нравится больше.
Отличие полиамории от полигамии
Полиаморию и полигамию часто путают, так как о первой в русском языке известно довольно мало. Эти термины имеют ряд отличий:
Отличие от свинга
Полиамория отличается числе и от свингерства. Свингерство предполагает просто сексуальные контакты. Полиаморные люди испытывают к своим партнерам куда более глубокие чувства, сильную эмоциональную привязанность.
Полиаморы практикуют длительные и серьезные отношения, а не связи ради сиюминутного удовлетворения сексуальных потребностей.
Отличие от измены
Измена подразумевает сокрытие, тайные встречи с возлюбленным или возлюбленной. При полиаморном союзе человек не может застукать свою возлюбленную в объятиях другого мужчины и списать все на полиаморию.
Полиамория – это заранее обговоренный союз, на который согласны все из сторон. Она не подразумевает тайн, предательства или действий за спиной у своего партнера.
Основные идеалы
Правила и идеалы отношений всегда видоизменяются в зависимости от ситуации, но обычно полиаморы придерживаются следующих ценностей:
Почему люди выбирают полиаморию – причины
Если речь идет об осознанном выборе полиамории, то люди вступают в такую связь по причинам:
А что вы думаете о полиаморных отношениях? Поделитесь своими мыслями в комментариях.
Как охарактеризовать полиаморных людей
Полиаморы утверждают, что их видение отношений – это нечто вроде ориентации, с полиаморией рождаются. Такие люди могут любить несколько человек одновременно.
Полиаморы характеризуются высокой степенью осознанности. Им просто не интересно вступать в отношения по стандартной схеме «один человек на всю жизнь, свадьба, дети». Они мыслят шире и готовы предоставлять другим людям такую же свободу и право выбора.
Люди в полиаморных отношениях готовы уделять разговорам и налаживанию контактов много времени. Они также испытывают обычные человеческие чувства, такие как любовь, ревность, обида.
Если человек видит себя в такой связи, то ему придется воспитать в себе высокую степень ответственности. Нужно уметь адекватно управлять собственными эмоциональными ресурсами и распределять их, а также ценить собственный комфорт и личное пространство.
Однако, в обществе есть люди, которые считают полиаморных людей распущенными и угнетающими истинные семейные ценности.
А как вы относитесь к полиаморам? Расскажите о своей точке зрения в комментариях, нам и нашим читателям будет интересно с ней познакомиться.
В видео представитель полиамории представляет свою точку зрения.
Какими бывают полиаморные отношения – формы
Полиаморные отношения могут быть разными, делиться на несколько разновидностей и форм.
Полиамория: почему некоторые выбирают отношения с разными партнерами
Что такое полиамория
Полиамория, или этичная немоногамия — наличие нескольких партнеров и интимных взаимоотношений. Они могут быть как сексуальными, так и платоническими, но обязательно при полном согласии всех сторон, независимо от пола.
Каждый пятый американец состоял в немоногамных отношениях в прошлом и примерно один из 20 признается в них на настоящий момент. Исследования показывают, что партнеры в таких связях счастливы наравне с женатыми однолюбами [1]. Полиаморные отношения требуют открытости, доверия, согласия всех участников, а также хороших коммуникативных навыков, четких границ и взаимного уважения. Полиамория отличается от других форм открытых отношений, таких как свинг, где речь идет преимущественно о сексуальных отношениях с участием других людей или пар без эмоциональной привязанности.
Юридически полиамория не признается разновидностью сексуальной ориентации. Но этот вопрос остается предметом множества споров среди сексологов и «практикующих» полиамористов. Многие люди, состоящие в немоногамных отношениях по обоюдному согласию, считают, что это их ориентация. Они пытались найти удовлетворение в моногамных отношениях, но не смогли. Термин «полиаморные отношения» по-прежнему позиционируется как личный выбор или образ жизни.
В чем отличие полиамории от полигамии
Полиаморию часто путают с полигамией или браком с более чем одним человеком одновременно, но это разные понятия. Полигамия подразумевает брак с несколькими людьми противоположного пола — чаще всего речь о мужчине с несколькими женами. Полиамория, хотя и включает в себя женатых партнеров, описывает более широкий спектр отношений, как гетеросексуальных, так и с представителями ЛГБТК+.
Немоногамия может быть различной. Сексуальные отношения варьируются от полиамории до полигамии. Иные договоренности могут включать поливерность — закрытые отношения, предполагающие сексуальную и эмоциональную преданность группе, состоящей более чем из двух человек, и анархию отношений, формат, при котором иерархия отсутствует и, соответственно, нет деления партнеров на «основных» и «дополнительных».
Почему люди выбирают полиаморию
Некоторые сторонники полиамории считают, что ценность классических отношений между двумя партнерами устарела, и переосмысливают шаблонные представления о сексе и романтике.
«В моем близком круге полиамория — норма, а моногамия — исключение, — рассказывает Александр, fashion-дизайнер, состоящий в полиаморных отношениях. — В подростковом возрасте я влюблялся во всех подряд, и мне мешал стереотип, что любить надо кого-то одного. Лет с 18 я состоял сразу в нескольких параллельных отношениях, и речь не о разовом сексе, а об эмоциональной связи в том числе. Я уже 20 лет в браке, и моя жена — лучшая женщина в мире. Вначале мы считали себя моногамными. Но потребность в других людях оставалась, и было непонятно, как об этом говорить. Позже пришли к полиамории. Мы обсуждали вопросы ревности, предательства, и оказалось, что нам ничего не мешает наслаждаться обществом других людей. Я мыслю категориями эстетических переживаний. Бывает, что случайная связь на вечеринке перерастает в прекрасный духовный контакт, который не нарушается расстоянием. Так, с N мы встречаемся в разных странах, делаем совместные проекты. Для меня отношения, в которых отсутствует сексуальный аспект, неполноценны, а человеку, с которым связывают интимные отношения, проще доверять».
Нет никакого стандартного теста на определение склонности к полиамории. Отношения существуют для того, чтобы быть в них счастливыми. Поэтому на вопрос «Подходит ли вам полиамория?» ответ будет предельно простым. Важно только определиться, насколько комфортно пускать в свою жизнь нескольких людей и делить партнеров с другими.
За и против полиамории
Любые отношения могут разрушить ревность и споры о воспитании детей, предупреждает Алена Голзицкая, системный семейный психотерапевт, научный сотрудник Психологического института РАО. В полиаморных союзах эти аспекты усложняются количеством участников. Полиамория может храниться в секрете от близких друзей и семьи. По данным некоммерческой организации Loving More, по крайней мере каждый четвертый полиамор подвергался дискриминации.
Среди аргументов за можно выдвинуть следующие:
При этом сама теоретическая модель полиамории — все принимают всех, одобряют и получают удовольствие от любви ко всем, кто взаимно нравится, — на практике часто сталкивается с суровой реальностью. Некоторым людям привычно желать эксклюзивности отношений, особенно когда влюбленность в партнера велика и захватывает полностью. Тогда любой претендент на его внимание воспринимается как угроза, что рождает гнев, ревность и приводит к страданиям. Таким образом, бывает трудно достичь баланса в отношениях, когда новый человек воспринимается не как потенциальный разлучник, а как тот, кто важен для партнера и заслуживает уважения.
Еще одна сложность — принятие решения о переформатировании отношений. Бывает, что кто-то один в паре готов пойти на этот эксперимент, тогда как второй вынужден согласиться, осознавая, что если он откажется, то будет оставлен или обманут. В таких условиях почти невозможно говорить о свободном выборе такой формы отношений.
И еще нужно понимать, что с увеличением количества партнеров неизбежно увеличивается тот объем внимания и инвестиций, которые требуется делать, чтобы удовлетворить их потребности в отношениях. Таким образом, нужно быть готовым к овладению навыками организации взаимодействия, в котором никто не будет обделен, иначе неизбежно столкновение с обидой, завистью и злостью кого-то из партнеров, что не укрепляет союз.
Полиамория в России и в мире
Для сбора статистики социологи проводят опросы среди респондентов с полиаморических сайтов, рассылают анкеты. Стоит учитывать, что среди участников могут быть просто интересующиеся люди и те, кто не намерен отойти от моногамии. В октябре 2015 года были опрошены 5043 человек в возрасте 13–55 лет [2]. Статус респондентов оценивался с помощью вопроса «Считаете ли вы себя полиаморным?». Были предложены варианты ответов:
Исследование показало, что 59,8% опрошенных считают себя моногамными, 25,5% хотели бы попробовать полиаморные отношения, 7,6% указали, что состояли в них в прошлом, и 7,1% — полиаморны. Число людей из последней группы оказалось выше, чем ожидали исследователи. Они объясняют высокий показатель предвзятостью в выборке. В нее были включены пользователи соцсетей, которые сдают онлайн-тесты личности. Часто это молодые, либеральные, атеистические и негетеросексуальные люди.
Что касается пола, то среди мужчин больше представителей полиаморов, в то время как женщины в большинстве стремятся к моногамии.
Возрастные показатели практически не меняют взгляды на отношения с несколькими партнерами. После 33 лет теоретический интерес к ним снижается на фоне большего количество и моногамных, и полиаморных респондентов.
В 2015 году опрос также провел Американский институт общественного мнения Gallup [3]. По результатам исследований выяснилось, что количество людей, выбирающих полигамию, увеличилось почти в два раза по сравнению с 2001 годом.
Комментарии экспертов
Алена Голзицкая, системный семейный психотерапевт, научный сотрудник Психологического института РАО
Пока в России (как, полагаю, и во всем Западном мире) к полиамории относятся настороженно. Никакой официальной статистики по нашей стране нет, и еще долго не будет. Все-таки для внедрения чего-то нового в такую очень жестко регламентированную сферу жизни, как супружество или романтическое партнерство, требуется время.
По всей видимости, выбор полиамории связан с тем, что привычные формы организации отношений больше не удовлетворяют. Увеличение продолжительности жизни, появление возможности иметь несколько отношений, а не одни-единственные, ориентация на собственные интересы и потребности — все это ведет к тому, что человек пытается придумать, как устроить интимную часть своей жизни более приемлемым способом, чем просто вступая в тайные связи.
Полиамория может выступать попыткой пересмотра жестких норм общественной морали, диктующей, что только отношения двоих людей могут рассматриваться как подпадающие под категорию супружеских или любовных.
Вопрос «Как смириться с полиаморией партнера?» неверен. Полиаморным может быть только союз нескольких людей, сформированный на добровольной основе, а вот если кто-то из участников должен смиряться с такой участью, это уже не полиаморный союз, а абъюз. Не всегда в полиаморных союзах все участники имеют сексуальные отношения друг с другом. Так, например, в союзе одной женщины и двух мужчин последние могут не иметь никаких физических отношений между собой. И вообще — на то полиамория и добровольная форма взаимодействия, чтобы никто никого не заставлял делать что-то, чего он делать не готов или не хочет.
Арина Винтовкина, сексолог, психолог, журналист, автор блогов @vintovkina_arina и телеграм-канала «Это нормально», замужем, из 12 лет брака состоит в полиаморных отношениях четыре года
Я за добро и осознанность, против ханжества, гендерных стереотипов, гетеро- и моноцентризма. Анализируя свои отношения и полисоюзы друзей, могу сказать, что единственный общий знаменатель для адекватной полиамории — отсутствие изначально неудачных стартовых условий. Например, когда люди задумываются о полиамории, оказавшись в кризисной ситуации, и надеются таким образом «починить» отношения. До перехода в статус полиаморов мы с мужем несколько лет были «моногамишами». Разница между этим термином и классической моногамией в том, что у нас было больше сексуальной свободы, но отношения не были полностью открытыми. При этом всегда присутствовало секспозитивное мышление и взаимное доверие. Когда в моей жизни появилась персона, в адрес которой внутри меня что-то отозвалось и полыхнуло, я тут же сообщила об этом мужу. Хотелось разделить радость с близким человеком.
Наш главный принцип в полиаморных отношениях был и остается неизменным: сначала обсуждаем следующий шаг, потом совершаем его.
Быть открытым полиамором — это часто отбивать атаки и оправдываться. Я спокойно отношусь к любому частному мнению, когда оно выражается без явной враждебности. За последние годы меня называли и нарциссом, и человеком с расстройством психики, упрекали в детских травмах и проблемах с самооценкой. Могу сказать одно: сам по себе формат отношений, каким бы он ни был, не говорит ничего о проблемах человека или патологиях психики, это вопрос мотивации в каждом конкретном случае. А ее с порога определить невозможно, если вы не экстрасенс. Исследований о полиамории довольно мало. Но те, что есть, объективно показывают, что нет различий в личностных тестах, независимо от количества партнеров. Полиаморные люди не более невротичны или незрелы.
Например, было проведено сравнительное исследование 1986 года о неспособности быть в длительных отношениях, в котором участвовали 80 пар. Часть из них были моногамными, другие предпочли свободные отношения. Спустя пять лет и у тех, и у других была примерно одинаковая статистика по расставаниям — около 20%.
Полиамория не сделала меня менее ревнивой, чем я была, допустим, десять лет назад. Единственное, что изменилось, — я научилась проживать ревность. Мой муж так же считает, что брак — это не покупка, а договор и лучшие отношения возможны только по любви, без попытки оградить партнера от того, что приносит ему радость. На каких условиях любимому человеку разрешается делать то, что он хочет? На условиях того, что он будет счастлив. А любовь — это всегда про принятие.