Как лучше всего моделировать дружбу между пользователями для сайта социальной сети?
Возможные состояния:
теперь сложно выбрать правильные модели.
совершенно очевидно, A.profile.friends - это отношение многих ко многим к другим пользователям.
, но кажется довольно нечистым объединять друга с родственником-просьбой о дружбе. и без этого слияния данные будут избыточными, потому что тогда «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 с необходимостью объединения двух наборов
другим вариантом будет модель Friend с полем friends, которое является полем many2many, которое ссылается ровно на двух человек. Затем выбор соответствует одному из людей в поле друзей, а затем просто возвращает модель, где человек B может быть извлечен путем вычитания A из набора друзей. Но это было бы излишним, потому что ни один объект-друг никогда не будет связан с более чем двумя людьми.
Friend-Lookup: Friendship.objects.filter (people__contains = A) # запрашивает две таблицы
Итак, как вы думаете, какое решение для сохранения дружеских отношений является наиболее чистым и интуитивно понятным? Есть ли какие-нибудь общие шаблоны, как это сделать?