Задача довольно распространенная.Вы хотите хранить пары, где A | B имеет то же значение, что и B | A.Поскольку в таблице есть столбцы, один из двух будет храниться в первом столбце, а другой - во втором, но кого хранить первым, а кого вторым и почему?
Одним из решений является сохранение меньшего идентификаторапервый и больший идентификатор второй:
userid1 | userid2
--------+--------
1 | 2
2 | 5
2 | 6
4 | 5
Преимущество заключается в том, что вы сохраняете каждую пару только один раз, что кажется естественным, но имеет недостаток в том, что вы должны искать человека в обоих кумах и найти его друга.иногда в первом, а иногда и во втором столбце.Это может привести к тому, что запросы будут выглядеть неуклюже.
Другой метод - это избыточное хранение пар (обычно с помощью триггера):
userid1 | userid2
--------+--------
1 | 2
2 | 1
2 | 5
2 | 6
4 | 5
5 | 2
5 | 4
6 | 2
Здесь запросы проще: ищите человека в одномколонка и найти своих друзей в другом.Тем не менее, выглядит странно, что все пары дублируются.И вы полагаетесь на триггер, который некоторым не нравится.
Третий метод - хранить пронумерованные дружеские отношения:
friendship | user_id
-----------+--------
1 | 1
1 | 2
2 | 2
2 | 5
3 | 2
3 | 6
4 | 4
4 | 5
Это дает обоим пользователям в паре одинаковое значение.Но для того, чтобы найти друзей, вам нужно пройти: найти друзей для пользователя, найти друзей в этих друзьях.Тем не менее, дизайн очень понятный и даже расширяемый, т. Е. У вас может быть дружба трех или более пользователей.
Ни один метод не может быть намного лучше, чем другой.