0

これが何と呼ばれるか正確にはわからないので、誰かが私のタイトルを編集して、私の意味をよりよく説明できることを願っています. ただし、この設定を検討してください。ユーザーが「閉じる」をクリックするまでメッセージが表示される通知システムを作成したいと考えています。次に、このユーザーが通知を却下したことを「覚えておく」必要があるため、再度表示されないようにする必要があります。ここに私の現在の解決策があります

  • usersテーブルにはuid主キーとユーザー情報があります
  • notificationsテーブルにはnid主キーと通知テキストがあります
  • notifications_seen2 つの列を持つテーブル、uidおよびnid

誰かが通知を閉じるをクリックすると、私は彼らuidと通知を に保存nidnotifications_seenます。これは正常に動作しているように見えますが、phpMyAdmin にはnotifications_seen、インデックスがないことを示す巨大な赤いメッセージが表示されます。ただし、どちらの列も一意ではありません。まったく役に立たない列を追加してnotifications_seen、それを主キーと呼ぶべきでしょうか? これを行うより良い方法はありますか?

4

3 に答える 3

1

複数の列を使用して主キーを作成できます。この場合、nid AND uid を notifications_seen テーブルの主キーとして設定する必要があります。ここでの考え方は、notifications_seen テーブル内で nid も uid も一意ではないということです。nid/uid ペアは一意です。これら 2 つの列に主キー制約を追加する必要があります。これは通常、この種の状況でやりたいことです。

主キーを単純化するために、実際に自動インクリメント行を作成したい場合があります。たとえば、最適な候補キーが多くの列で構成されている場合 (これは空中から引き出していますが、4 つ以上の列としましょう)、または文字列を含む列がある場合です。ルックアップを行うときに一致するのが遅くなります。しかし、この状況では、主キー制約を 2 つの列に追加するだけで十分です。

主キーはデフォルトで索引付けされます。そのため、主キー制約を 2 つの列に追加する必要があります。これにより、同じ uid/nid ペアを持つ行を誤って挿入しないようにすることで、データの整合性も保持されます。

また、uid に対する外部キー制約を users テーブルの id に追加し、外部キー制約を notifications テーブルの id の nid に追加する必要もあります。外部キー制約を追加すると、実際には存在しない uid または nid が notifications_seen テーブルに挿入されなくなります。

于 2011-04-28T15:58:51.813 に答える
1

両方のnotifications_seen列を含むインデックスを作成できます! または、主キーのためだけに別の列を作成するか、両方を実行します-インデックスをオンにしてクエリを高速化する可能性があります(ただし、パフォーマンスの問題に気付くまではあまり心配しないでください-将来のために覚えておいてください) . これらの n:n 関係の主キーを持つことは、ひどいことではありません。uidnid

于 2011-04-28T15:59:02.747 に答える
1

uid複合主キー ( と の両方で構成される) を作成できる場合がありますnid

于 2011-04-28T15:59:13.633 に答える