Лучший способ реализовать список друзей в базе данных?MySQL - PullRequest
0 голосов
/ 22 октября 2018

Итак, у моего проекта есть «список друзей», и в базе данных MySQL я создал таблицу:

nameA

nameB

Первичный ключ (nameA, nameB)

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

Мой проект также использует Redis .. Я мог бы сохранитьих там.

Когда кто-то присоединяется к серверу, мне нужно будет найти все записи, чтобы узнать, является ли их имя nameA или nameB, а затем соединить эти два имени в друзья, это также может быть неэффективно.

Приветствия.

1 Ответ

0 голосов
/ 22 октября 2018

Задача довольно распространенная.Вы хотите хранить пары, где 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

Это дает обоим пользователям в паре одинаковое значение.Но для того, чтобы найти друзей, вам нужно пройти: найти друзей для пользователя, найти друзей в этих друзьях.Тем не менее, дизайн очень понятный и даже расширяемый, т. Е. У вас может быть дружба трех или более пользователей.

Ни один метод не может быть намного лучше, чем другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...