MySQL получает структуру и производительность друзей друзей

Я просто хотел бы найти структуру базы данных в MySQL, чтобы получить всех пользователей друзей друзей и соответствующий запрос для их получения. (дружеские ссылки двунаправленные)

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

Структура 1

Многие сообщения предлагают структуру, в которой у вас есть таблица, в которой каждая строка представляет собой дружескую ссылку, например:

    CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL,
    `friend_id` int(10) unsigned NOT NULL,
    )

говорит, что у пользователя «1» есть три друга «2», «3», «4», а у пользователя «2» есть два друга «1», «5». Ваша таблица друзей будет выглядеть так:

    user_id    |    friend_id
    1          |    2
    1          |    3
    1          |    4
    2          |    1
    2          |    5

друзья друзей запрос: Как выбрать друзей друзей можно увидеть здесь SQL для получения друзей И друзей друзей пользователя . Результат запроса для пользователя «1» должен дать (1,2,3,4,5)

Мое беспокойство: у среднего пользователя fb около 140 друзей. У постоянных пользователей будет намного больше. Если у меня будет 20 000 пользователей, это будет как минимум 3 миллиона строк.

Структура 2

Если бы я мог использовать такую ​​структуру:

    CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL,
    `friend_1` int(10) unsigned NOT NULL,
    `friend_2` int(10) unsigned NOT NULL,
    `friend_3` int(10) unsigned NOT NULL,
    `friend_4` int(10) unsigned NOT NULL,
    ....
    )

Моя таблица выглядела бы так (пример сверху):

    user_id  |  friend_1  |  friend_2  |  friend_3  |  ...
    1        |  2         |  3         |  4         |
    2        |  1         |  5         |            |...

Теперь у меня всего 20 000 строк.

Друзья друзей запрос: Чтобы выбрать пользователей друзей друзей, я попробовал

    Select * FROM friends as a
    WHERE a.user_id 
    IN (
        SELECT * FROM friends AS b
        WHERE b.user_id = '1'
    )

, но получаю сообщение об ошибке «# 1241 - Операнд должен содержать 1 столбец». Я думаю, проблема в том, что подвыбор передает строку, а не столбец?

Вопросы

Надеюсь, вы понимаете мою озабоченность. Я был бы очень рад любым ответам на эти вопросы

1) найти запрос, который возвращает всех друзей друзей для указанного пользователя в структуре 2 ?

2) Какая структура позволяет мне быстрее возвращать друзей друзей? В структуре 2 я думаю, что «соединение строки с столбцом » может быть медленным, если здесь даже возможно использовать соединение. Спасибо за любые предложения. Если бы вы могли придумать какие-либо другие структуры, возможно, воспользовавшись преимуществами типа сети «маленький мир», я был бы рад их услышать.

СПАСИБО !!

5
задан Community 23 May 2017 в 10:34
поделиться