Подтвердить что ты не робот

Как избежать полиморфных ассоциаций

Учитывая, что вам нужно внедрить ленту новостей, такую ​​как в социальных сетях, ex facebook. В настоящее время я использую класс News, который имеет полиморфную ассоциацию, которая может быть любого типа, как Image, Comment, Friendship, GroupMembership и т.д. Всякий раз, когда объект создается, так как создается News. Он отлично работает с AR (ActiveRecords), но у меня возникают проблемы, когда я переключаюсь на DM (DataMapper) или Sequel, так как оба они не поддерживают полиморфные ассоциации и не поощряют его использование.

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

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

4b9b3361

Ответ 1

Отказ от ответственности: я ведущий разработчик Sequel.

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

news:
  id
  ... (Other columns)
  image_id
  comment_id
  friendship_id
  group_membership_id

На самом деле нет разницы в производительности при выполнении таких действий против наличия общего внешнего ключа и сохранения имени класса. Для ленивой загрузки вы просто выбираете одно поле внешнего ключа, которое не равно nil/NULL, и выберите соответствующую ассоциацию для загрузки. Для загрузки запросов за стол вы просто загружаете все ассоциации сразу. Это также более гибко, поскольку вы можете с нетерпением загружать JOIN, что невозможно при полиморфном подходе. Кроме того, вы получаете реальную ссылочную целостность.

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

Ответ 2

Вот жемчужина для поддержания ссылочной целостности полиморфных ассоциаций на уровне базы данных в Rails:

https://github.com/mkraft/fides

С этой публикации есть адаптеры для SQLite3 и Postgresql.

Отказ от ответственности: я написал драгоценный камень.