すべての友達がユーザーテーブルにも含まれていると仮定すると、単純な1対多の関係を定義する友達テーブルが必要になります。つまり、ユーザーテーブルをそれ自体にリンクします。だから
User Table
UserID int identity not null
[other attribute fields]
Friends Table
UserIDLink1 int
UserIDLink2 int
[other attribute field]
UserIDLink1とUserIDLink2の両方がUsersテーブルの外部キーである場合。
たとえば、3人のユーザーがいる場合
1 Joe
2 Bill
3 Jane
ジョーとジェーンは友達です。友達テーブルには1行が含まれます
1 3
上記は、AがBの友達である場合、BはAの友達であると暗黙的に想定しています。そうでない場合は、UserIDLink1とUserIDLink2の名前をUserIDとFriendIDなどに変更することをお勧めします。レコードも最大2倍になります。
また、双方向構成(BがAのフレンドである場合、AはBのフレンド)の場合、(UserIDLink1、UserIDLink2)および(UserIDLink2、UserIDLink1)のFriendsテーブルにインデックスを設定して、アクセスが常に効率的であることを確認する必要があります。 joeの友達またはjaneの友達を検索していました(2番目のインデックスを設定しなかった場合、最初のクエリは効率的なインデックスルックアップになりますが、2番目のクエリでは全表スキャンが必要になります)。
リンクが双方向でない場合は、Aの友達を見つける必要はありませんが、Bが友達であるかどうかも調べる必要があるため、おそらく最も必要になります。