Supponendo che tutti i tuoi amici siano anche nella tabella degli utenti, avrai bisogno di una tabella degli amici che definisca una semplice relazione uno-a-molti, collegando la tabella degli utenti a se stessa. Quindi
User Table
UserID int identity not null
[other attribute fields]
Friends Table
UserIDLink1 int
UserIDLink2 int
[other attribute field]
Dove UserIDLink1 e UserIDLink2 sono chiavi esterne nella tabella Utenti.
Quindi, ad esempio, se ho tre utenti
1 Joe
2 Bill
3 Jane
e Joe e Jane sono amici, la tabella Friends conterrebbe una singola riga
1 3
Quanto sopra presuppone implicitamente che se A è un amico di B, allora B è un amico di A - in caso contrario, probabilmente vorresti rinominare UserIDLink1 e UserIDLink2 in UserID e FriendID o simili - nel qual caso dovresti avere fino a raddoppiare i record anche.
Anche per la configurazione bidirezionale (A è amico di B se B è amico di A) è necessario impostare gli indici nella tabella Amici per (UserIDLink1,UserIDLink2) e (UserIDLink2,UserIDLink1) per garantire che l'accesso sia sempre efficiente se stavamo cercando amici di joe o amici di jane (se non hai impostato il secondo indice, la prima query sarebbe una ricerca efficiente dell'indice ma la seconda richiederebbe una scansione completa della tabella).
Se i tuoi link non fossero bidirezionali, questo non sarebbe necessario per scoprire chi sono gli amici di A, ma probabilmente lo avresti comunque più richiesto poiché probabilmente dovrai anche scoprire di chi B è amico.