1対多/多対1の状況に推奨されるテーブルセットアップ
-
06-09-2019 - |
質問
誰かがポジションの募集を投稿し、資格のある人には募集が表示されますが、そうでない(またはオプトアウトした)人には募集が表示されないスクリプトを作成する必要があります。したがって、2 人が同じページにアクセスして、異なるコンテンツ (潜在的に同じものもあれば、完全にユニークなもの) も表示される可能性があります。そのデータを MySQL DB/テーブルに配置する最適な方法がわかりません。
たとえば、投稿ごとに整理することもできますが、次のようになります。
PostID VisibleTo
PostingA user1,user2
そして、それは間違っているようです (列の CSV スタイル)。または、個人で行くこともできます。
User VisiblePosts
user1 投稿 1、投稿 2
しかし、それは同じ問題です。ユーザーを一意にし、投稿を一意にし、一致する場合にのみ参加させる方法はありますか?
この決定は最初、別のテーブルのセットに対して一連のクエリを実行することによって行われますが、一度実行されると、ユーザーが位置を投稿した後もコードの一部が変更されない場合に、コードの一部を何度も実行するのは非効率であるように思えます。
...よく考えると、変更される可能性がありますが、変更されないと仮定した場合(その可能性は低く、ユーザーが資格を失ったものを目にしたとしても影響はほとんどないため)、これに対する標準的な解決策はありますか?シナリオ?
解決
これは、多対多の関係またはN:Mの関係
あなたは、追加のテーブルを作成し、列PostVisibility
とPostID
で、UserID
を言います。 PostID
とUserID
の組み合わせがテーブルに存在する場合、そのポストは、そのユーザーに表示されます。
他のヒント
の3つの表...
ユーザー: [ユーザーID] 【OtherField
ポスト: [PostId] 【OtherFields
UserPost: [ユーザーID] 【PostId
User.UserIdは、UserPost.UserIdに参加します Post.PostIdがUserPost.PostIdに参加
そして、あなたは、表示する記事を選択しているとき、ポストに入社、テーブルUserPostを検索
編集:申し訳ありませんが、投稿ユーザーと多対多の用語で話していると思います。私はこれを、投稿と「閲覧権」の条件、つまり 1 対多の観点から考えました。
何かが欠けている場合を除き、これは 1 対多の状況であり、2 つのテーブルが必要です。たとえば、各投稿には、それを閲覧できる n 人のユーザーがいます。投稿は個々のユーザーに固有であるため、逆の操作を行う必要はありません。
PostingID (およびその他のデータ) を含む PostingTable
PostingID と UserID を含む PostingVisibilityTable
UserID とユーザーデータを含む UserTable
表示権限とは別に投稿を作成し、表示テーブルに対して PostingID/UserID のペアを個別に追加/削除します。
現在のユーザーに表示されるすべての投稿を選択するには:
SELECT * FROM PostingTable A INNER JOIN PostingVisibilityTable B ON A.PostingID = B.PostingID WHERE B.UserID = "currentUserID"