2

これまでトリガーを使用したことはありませんが、これは確かなユースケースのようです。トリガーが使用すべきものであるかどうかを知りたいのですが、そうであれば、それをどのように実行するかについて少し手をつなぐことができます。

基本的に、2つの大幅に非正規化されたテーブルとがgoalsありusers_goalsます。どちらにも、データを複製するtitle列( )があります。したがって、「トリガーの使用方法を学ぶ」という1つの主要な目標と、同じタイトルを持つ多くの(この場合はそれほど多くない)ユーザーの目標があります。サイトのアーキテクチャでは、これが当てはまることが要求されます。VARCHARtitle

私はまだこれらの2つのテーブルの間に関係を持つ必要はありませんでした。個々のユーザーの目標から主な目標にリンクしますが、タイトルごとのクエリ(列INDEXにを表示)を使用してリンクします。次に、これら2つのテーブルを関連付ける3番目のテーブルが必要ですが、結果整合性が必要なだけです。sと。の両方の2つの列があります。titleFOREIGN KEYgoal_idusers_goal_id

トリガーはこれを実行する方法ですか?もしそうなら、それはどのように見えるでしょうか?

4

2 に答える 2

1

いいえ、回避できる場合は、トリガーをまったく使用しないでください。

トリガーは私にとってアンチパターンです。それらには、「プログラマーの背後で物事を行う」効果があります。

アプリケーションの将来の保守担当者が何かを行う必要があると想像してください。彼らがトリガーを認識していない場合 (データベース スキーマ作成スクリプトを詳細にチェックしていないと想像してください)、その理由を突き止めるために非常に長い時間を費やす可能性があります。これが起こります。

テーブルを更新するクライアント側コードがいくつか必要な場合は、ストアド プロシージャを使用することを検討してください。これをコード保守マニュアル (およびコメントなど) に文書化して、将来の開発者が同じことを行うようにします。

それを回避できる場合は、共有列を更新するために常に呼び出される共通ルーチンをクライアント側に記述してください。

トリガーでさえ、列が常に同期していることを保証するものではないため、とにかくこれをチェックする定期的なプロセスを実装する必要があります。そうしないと、遅かれ早かれ同期が取れなくなります (運用エンジニアが手動更新を開始することを決定したためかもしれません。1 つのテーブルはバックアップから復元され、もう 1 つのテーブルは復元されない可能性があります)。

于 2010-11-22T05:17:30.900 に答える
1

はい、トリガーを使用してこれを行うことができますが、正確な実装は要求によって異なります。

すべてのクエリを再構築したい場合は、結合にタイトルを使用せず、代わりに goal_id を使用するだけで、それを構築できます。タイトルの同期も維持する必要がある場合、それは余分です。

まずは参加です。あなたは、人goalにはたくさんのがあると述べましたuser goalsuser goalそれは、それぞれが 1 つだけに属しているということgoalですか? その場合、余分なテーブルは必要ありません。テーブルに列goal_idを追加するだけです。user_goals参照整合性を強制できるように、外部キー制約があることを確認してください (InnoDB テーブルを使用していることを願っています)。

次にトリガー。MySQLでそれらを書く方法が正確にはわかりません。Oracle ではトリガーをよく使用しますが、MySQL ではめったに使用しません。とにかく、3 つのトリガーを作成することをお勧めします。

  1. テーブルのトリガーを更新しgoalsます。このトリガーはuser_goals、タイトルが変更されたときに関連テーブルを更新する必要があります。
  2. テーブルのトリガーを更新しuser_goalsます。が変更された場合user_goals.title、このトリガーは、goals表のタイトルが の新しいタイトルと異なるかどうかを確認する必要がありますuser_goals。その場合、次の 2 つのオプションがあります。
    1. 例外: user_goals 子テーブルでタイトルを変更できないようにしてください。
    2. 更新: タイトルを変更できるようにします。目標の親レコードを更新します。目標のトリガーは、他の関連する user_goals を更新します。
    3. トリガーの値を元に戻すことで変更を黙って無視することもできますが、それは良い考えではありません。
  3. にトリガーを挿入しuser_goalsます。最も簡単なオプションは、指定されたのタイトルを照会し、タイトルにgoal_id別の値を挿入できないようにすることです。goalsタイトルが指定されている場合は、更新を選択できます。
  4. ゴールにトリガーを挿入します。これは必要ありません。
于 2010-11-21T22:05:40.643 に答える