あなたは正しい方向に進んでいます。リンクされたテーブルを使用する必要があります。テーブルユーザーから始めます。各ユーザーにはIDがあります。次に、テーブルusers_friendsを作成します。このテーブルは、user_idとfriend_idの2つのIDで構成されます。最後のテーブルはusers_restrictedで、これもuser_idとrestricted_idの2つのIDで構成されます。
例えば
users
user_id name
1 user1
2 user2
3 user3
users_friends
friend1_id friend2_id
1 2
2 3
これは、ユーザー1と2が友達であり、ユーザー2と3が友達であることを示しています。(これは、ユーザー1がユーザー2と友達である場合、ユーザー2もユーザー1と友達であると想定しています)
users_restricted
user_id restricted_id
1 2
これで、ユーザー1とユーザー2は友達ですが、ユーザー2は制限リストに含まれているため、ユーザー2はユーザー1のエントリを表示できません。
テーブルはIDを介してリンクされており、すべてのIDはユーザーテーブルから取得されていることがわかります。これは、エントリに関連するように拡張することもできます。IDでエントリを参照するだけです。
特定のエントリに対してユーザーをブロックするには、次の表があります。
entries
entry_id user_id ... other columns holding entry information
1 1
2 1
3 2
4 2
これで、ユーザー1は2つのエントリ(エントリ1とエントリ2)を作成し、ユーザー2は2つのエントリ(エントリ3とエントリ4)を作成しました。別のテーブルが制限を保持します。
entries_restricted
entry_id restricted_user_id
1 2
これは、ユーザー2がエントリ1を表示できないことを意味します。
エントリをユーザー2に表示するには、ステートメントは次のようになります。
SELECT e.*, er.entry_id FROM entries e JOIN entries_restricted er ON e.entry_id=er.entry_id WHERE er.restricted_user_id != 2;
このステートメントは、ユーザー2に制限されているエントリーを除くすべてのエントリー情報を選択します。