Тот факт, что отношение может быть (или всегда) симметричным, не означает, что оно обязательно должно быть смоделировано как одно логическое отношение.Я думаю, что может быть более общим смоделировать возможность того и другого, а затем предотвратить одностороннюю дружбу в вашем приложении, если вы того пожелаете.
В этом случае для каждого пользователя у вас может быть набор пользователей, которых они считаютих друг (Один -> Многие).Вы можете сохранить копию (или кэш) того, является ли он симметричным или нет на каждом из этих объектов отношений, чтобы сделать его немного более масштабируемым.
Грубый пример того, как может выглядеть пользовательский объект:
{
"userId": 1,
"friends": [{"userId": 2, "friendsBack": true | false}, ...]
}
Операции с этими группами пользователей, например, пересечения (общие друзья), были бы намного проще, так как доступ к ним осуществлялся непосредственно из объекта пользователя.