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

Учитывая Вас должны реализовать ленту новостей как один замеченный в социальных сетях, исключая Facebook. В настоящее время я использую класс Новостей, который имеет полиморфный assocation, который может быть любого вида как Изображение, Комментарий, Дружба, GroupMembership, и т.д. Каждый раз, когда Объект создается, как Новости создаются также. Это хорошо работает с AR (ActiveRecords), но я попадаю в беду, когда я переключился бы на DM (DataMapper) или Продолжение и как не делаю natevily поддерживают полиморфные ассоциации и препятствуют, это - использование.

Одно обходное решение должно было бы использовать большой пункт SQL с партией ОБЪЕДИНЕНИЙ для слияния всех различных таблиц, которые нужно рассмотреть как новости. Но это имеет некоторые недостатки, особенно производительность была бы ужасна.

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

12
задан serengeti12 25 January 2012 в 17:40
поделиться

1 ответ

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

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

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

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

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

22
ответ дан 2 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: