Supondo que todos os seus amigos também estejam na tabela de usuários, você precisará de uma tabela de amigos que defina um relacionamento simples de um para muitos - vinculando a tabela de usuários de volta a si mesma. então
User Table
UserID int identity not null
[other attribute fields]
Friends Table
UserIDLink1 int
UserIDLink2 int
[other attribute field]
Onde UserIDLink1 e UserIDLink2 são chaves estrangeiras na tabela Users.
Por exemplo, se eu tiver três usuários
1 Joe
2 Bill
3 Jane
e Joe e Jane são amigos, então a tabela Friends conterá uma única linha
1 3
O acima assume implicitamente que se A é amigo de B, então B é amigo de A - se não for esse o caso, você provavelmente deseja renomear UserIDLink1 e UserIDLink2 para UserID e FriendID ou similar - nesse caso, você tem até dobrar os registros também.
Também para a configuração bidirecional (A é amigo de B se B for amigo de A) você deve configurar índices na tabela Friends para (UserIDLink1,UserIDLink2) e (UserIDLink2,UserIDLink1) para garantir que o acesso seja sempre eficiente se estávamos procurando amigos de joe ou amigos de jane (se você não configurou o segundo índice, a primeira consulta seria uma pesquisa de índice eficiente, mas a segunda exigiria uma verificação completa da tabela).
Se seus links não fossem bidirecionais, isso não seria necessário para descobrir quem são os amigos de A, mas você provavelmente ainda precisaria disso, pois provavelmente também precisará descobrir quem B é amigo.