2

私は更新の問題によく遭遇しますが、多くの関係があります。たとえば、次の 3 つのテーブルを見てみましょう。

  • 投稿
  • タグ
  • 投稿タグ

ユーザーが新しい投稿を作成するとき、投稿にタグを追加できます。投稿が保存され、選択したタグが _posts_tags_ 経由で添付されます。

ユーザーが投稿を編集し (タグリストも編集する場合としない場合があります)、フォームが送信されると、投稿のタグリストを更新する必要があります。

解決策は次のとおりです。投稿を更新するときに、その投稿のすべてのタグを _posts_tags_ から削除し、送信されたタグを挿入します。

別の解決策は、データベースから投稿のすべてのタグを取得し、リストを送信されたものと比較して、削除する必要があるものと挿入する必要があるものを決定することです。

どちらのソリューションも時間がかかる場合があります。
問題のより賢い解決策は何ですか?

4

1 に答える 1

0

投稿が編集され、タグが編集されていない場合(オプション)、投稿を保存して何もしません。なんで?原因、posts、tags、posts_tagsテーブルには、主キーである自動インクリメント列があります。この数値列は、それぞれのテーブルの外部キーになります。つまり、テーブルは次のようになります。

投稿:id_post(PK)、post_title、post_content

タグ:id_tag(PK)、tag_name

post_tags:id_post_tag(PK)、id_post(FK)、id_tag(FK)

PK:主キーFK:外部キー

この形式でデータを保存すると、データベーススキーマと関係を維持するためにテキストデータが使用されなくなるため、依存テーブルを更新する必要がなくなります。また、Bonoが示唆するように、データベースはカスケードジョブでビジーではないため、トランザクション時間が短縮されます。

次に、投稿内のすべてのタグに対して単純なループを実行して、post_tagsテーブル内のid_postに対してそれらの存在を確認し、見つからない場合は挿入します。このループを実行しながら、以下で使用する文字列を作成します。

次に、次のクエリを実行します。

delete from post_tags where id_post = {$id_post} and id_tag not in {$list_id_tags}

この操作は、行の追加と削除によって発生するIO操作を最小限に抑えることで、データベースサーバーの過負荷を最小限に抑えます。すべてのpost_tagsを削除してからすべてのタグを再度挿入する場合は、大きなIOが生成されますが、この方法ではそれが最小限に抑えられます。

于 2012-05-15T17:38:22.790 に答える