В настоящее время я создаю сайт социальной сети для клиента, и я выразил это таким образом
CREATE TABLE [dbo].[PersonFriend] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Timestamp] DATETIME NOT NULL,
[ChangeUser] NVARCHAR (200) NOT NULL,
[FriendStatusId] TINYINT NOT NULL,
[Person1Id] INT NOT NULL,
[Person2Id] INT NOT NULL,
[Person1RequestTimestamp] DATETIME NOT NULL,
[Person2AcknowledgeTimestamp] DATETIME NULL
);
Каждый человек хранится в таблице Person (представьте себе это). Поля Person1Id и Person2Id являются FK для таблицы person. Я сохраняю список состояний в таблице FriendStatus, чтобы указать, был ли что-то запрошено, принято, отклонено, проигнорировано и т. Д. Поле Timestamp является стандартным в моем проекте для указания создания записи (это шаблонная вещь, используемая базовым классом постоянства). ) и его вид дублируется в этой таблице, поскольку Person1RequestTimestamp содержит те же данные. Я также фиксирую, когда Person2 увидел запрос и выполнил действие (которое указывается в FriendStatusId), и сохранил его в Person2AcknowledgeTimestamp).
В одном из основных предположений этого плана можно указать, что Person1 запрашивал дружбу с Person2 - если эта дружба принята, тогда дружба считается взаимной.