0

Мое веб-приложение должно ВСЕГДА запрашивать соединения 2-й степени. Каждый пользователь скажет 200 друзей & у этих друзей есть 200 друзей. Я мог бы использовать некоторую помощь в определении правильной базы данных (и структуры таблицы), чтобы быстро сделать это веб-приложение & отзывчивым.Выбор базы данных: часто запрашиваются подключения 2-й степени

Бизнес-логика: Пользователи ищут их 1-й 2-й & соединения степени, чтобы получить список других пользователей, которые используют конкретную услугу (хранится в одном столбце, как неподписанных Int). Это единственная функциональность этого приложения.

Структура таблицы:

  • Таблица Пользователь: User_ID (рк), Facebook_ID (ск), имя, Specific-сервис, расположение
  • Отношения Таблица: до сих пор не определились.

Вопрос: Я прочитал много сообщений & искал в Интернете «проектирования баз данных социальных сетей». Однако эти приложения сильно отличаются от моих. У меня будет много пользователей (+10 мил), но небольшая база данных & запускает только один запрос, как описано в бизнес-логике.

Дополнительная информация: Пользователи могут зарегистрироваться (&), только используя свою учетную запись на Facebook. Их друзья будут приглашены (через Facebook), чтобы зарегистрироваться. Стол сообщений будет заполнен после регистрации друзей (только активные/неблокированные/незапланированные друзья). Таким образом, я могу избавиться от колонки "friendship status" от Отношения Таблица.

ответ

0

Вам нужна таблица с двумя идентификаторами в ней; он определит «Друг». Является ли это соотношение симметричным? То есть, если A является другом B, является B другом A? Хорошо, я предполагаю, что есть два ряда, когда они происходят.

Тогда

CREATE TABLE Friends (
    user1 ..., 
    user2 ..., 
    PRIMARY KEY(user1, user2), 
    INDEX(  user2, user1) 
) ENGINE=InnoDB; 

SELECT a.name, c.name 
    FROM Users AS a 
    JOIN Friends AS ab ON ab.user1 = a.user_id 
    JOIN Users AS b ON b.user_id = ab.user2 
    JOIN Friends AS bc ON bc.user1 = b.user_id 
    JOIN Users AS c ON c.user_id = bc.user2 
    WHERE a.user_id = ? 
+0

Да конструкция симметрична и нет других вариантов (например, отслеживаемые, Заблокированные контакты и т.д.). Но мой реальный вопрос: будет ли этот проект эффективным, когда я выполню запрос, чтобы найти друзей второй степени? –

+0

Если все кэшировано, тысяча друзей второй степени должны занять до секунды. Даже если он не полностью кэширован, это может занять лишь секунду. –

+0

Не могли бы вы также прокомментировать свой опыт использования базы данных? Я имею в виду, следует ли мне обращаться к базе данных графов или РСУБД? –