Лучшие модели дружбы (в Django)

Как лучше всего моделировать дружбу между пользователями для сайта социальной сети?

Возможные состояния:

  • нет дружбы
  • FriendRequest от A к B, B необходимо подтвердить (это асимметрично)
  • A и B дружат (это симметрично)

теперь сложно выбрать правильные модели.

Мои друзья являются частью моего профиля

совершенно очевидно, A.profile.friends - это отношение многих ко многим к другим пользователям.

  • нет дружбы: B нет в A. друзья и A нет в B. друзья
  • A просит дружбы с B: B в A. друзья
  • Друзья: B в A. друзья и A в B. друзья

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

Friend-Lookup: A.friends.filter (friends__contains = B) # довольно сложный поиск на уровне базы данных, не интуитивно понятный для кодеров

Отдельные таблицы

FriendRequest довольно очевиден, класс с запрашивающим и запрошенным_пользователем, выбирает тоже вполне очевидны.

Модель друга была бы не очень хорошей, потому что в ней были бы поля person1 и person2, и при всех поисках нужно было выбирать Друзья с person1 = A и person2 = B ИЛИ person1 = B и person2 = A

Friend- Поиск: Friend.objects.filter (person1 = A) union Friend.objects.filter (person2 = A) #unclean с необходимостью объединения двух наборов

Разделить таблицу many2many

другим вариантом будет модель Friend с полем friends, которое является полем many2many, которое ссылается ровно на двух человек. Затем выбор соответствует одному из людей в поле друзей, а затем просто возвращает модель, где человек B может быть извлечен путем вычитания A из набора друзей. Но это было бы излишним, потому что ни один объект-друг никогда не будет связан с более чем двумя людьми.

Friend-Lookup: Friendship.objects.filter (people__contains = A) # запрашивает две таблицы

Итак, как вы думаете, какое решение для сохранения дружеских отношений является наиболее чистым и интуитивно понятным? Есть ли какие-нибудь общие шаблоны, как это сделать?

8
задан Machavity 30 June 2016 в 01:47
поделиться