Проектирование базы данных социальных сетей - дружеские отношения - PullRequest
1 голос
/ 29 сентября 2011

Я работаю над сайтом социальной сети, и мне нужны пользователи, чтобы иметь возможность дружить и / или блокировать друг друга. На мой взгляд, 2 пользователя могут быть Друг , В ожидании , Блок или NULL . Я хотел бы иметь одно представление, которое показывает одну строку для каждого подтвержденного отношения. Мое представление правильно показывает отношения, но мне пришлось сделать обходной путь, чтобы показать только 1 строку / отношение, не объединяя таблицу с самим собой и не меняя порядок или Запросчик и Запросчик.

У кого-нибудь есть идеи, как это почистить?

Спасибо, - Грег

Таблица отношений:

Запросчик (int) | Запрашиваемая (int) | ApprovedTimestamp (smalldatetime) | IsBlock (бит)

vwRelationship View:

SELECT DISTINCT 
                      CASE WHEN f.Requestor < f.Requestee THEN f.Requestor ELSE f.Requestee END AS UserA, 
                      CASE WHEN f.Requestor < f.Requestee THEN f.Requestee ELSE f.Requestor END AS UserB, CASE WHEN b.Requestor IS NULL AND b.Requestee IS NULL 
                      THEN CASE WHEN f.AcceptedTimestamp IS NULL THEN 'Pending' ELSE 'Friend' END ELSE 'Block' END AS Type
FROM         dbo.Relationship AS f LEFT OUTER JOIN
                          (SELECT     Requestor, Requestee
                            FROM          dbo.Relationship
                            WHERE      (IsBlock = 1)) AS b ON f.Requestor = b.Requestor AND f.Requestee = b.Requestee OR f.Requestor = b.Requestee AND f.Requestee = b.Requestor

Пример запроса:

Выбрать тип из vwRelationship Где (Пользователь A = 1 И Пользователь B = 2) ИЛИ (Пользователь A = 2 И Пользователь B = 1)

Сценарий:

  1. Пользователь 1 и Пользователь 2 не знают друг друга | Тип отношений = NULL
  2. Пользователь 1 друзей Пользователь 2 | Тип отношений = В ожидании
  3. Пользователь 2 принимает | Тип отношений = Друг
  4. через месяц Пользователь 2 блокирует Пользователь 1 | Тип отношений = Блок

1 Ответ

3 голосов
/ 11 ноября 2011

Вот что я использовал в итоге:

Table - Relationship
RelationshipID, RelationshipTypeID, CreatedByUserID, CreatedTimestamp

Table - RelationshipType
RelationshipTypeID, RelationshipTypeName

Table - UserRelationship
UserID, RelationshipID, IsPending

Кто-нибудь может придумать что-нибудь лучше?

...