0

mysql データベースを追跡する同じユーザーをすべて使用する一連の複雑な Web サイトがあるとします。(これは私たちの正確な状況ではありません: ただし、この投稿をできるだけ簡潔/効率的にするために状況を単純化しています)

ユーザーがサイトの使用を開始したときに、ユーザーがどこにいるかを常に把握しているわけではありません。実際、国フィールドが更新される可能性があるコードには約 50 のポイントがあります。ご利用のIPアドレスから収集する場合があります。彼がクレジットカードを使用したときにそれを取得する可能性があります. 彼がフォームに記入すると、それを取得する可能性があります。彼と電話で話したときにわかるかもしれません。

次のような単純な構造を想定します。

CREATE  TABLE `Users` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `County` VARCHAR(45) NULL ,
  PRIMARY KEY (`ID`) );

私が疑問に思っているのは、この人物に関するもう 1 つの情報を追跡する最善の方法は何かということです。

   `Number_of_Users_in_My_Country`.

簡単なクエリを実行して、各レコードでそれを取得できることはわかっています。しかし、私は常に他の2つの情報を必要としています:(私は実際に国を扱っているのではなく、100,000Xの数の他のグループを扱っていることに注意してください:繰り返しますが、郡はこの投稿を簡単にするためのものです)

  1. 国別のユーザー数と

  2. ユーザー数が x 未満の国の選択。

Number_of_Users_in_My_Country フィールドを更新するために国の値が変更されたときにトリガーを作成する必要があるかどうか疑問に思っています。

私はmySQLを初めて使用するので、これまたは他のアプローチに関する考えを知りたいです。

4

2 に答える 2

0

質問をいくらか単純化したので、完全に正確にすることは困難です。

一般に、可能であれば、これらの派生値をオンザフライで計算することを好みます。そして、それが価値があるかどうかを知るために、私はそれを試してみたいと思っています。100.000x レコードは特に恐ろしい数字ではありません。私は、アプリケーションの寿命を延ばすために狂ったメンテナンスに対処するよりも、クエリ/インデックス作成スキームの調整に時間を費やす方がはるかに好きです。

それを試してもうまくいかない場合、私の次の考慮事項は、古い/キャッシュされたデータを操作することです。それはすべてあなたのビジネス次第ですが、「私の国のユーザー数」の値が少し古くても問題ない場合は、これらの値を計算してアプリケーション層にキャッシュする方がはるかに優れています. キャッシングには、使用できる既存のライブラリが多数あり、ほとんどの開発者がよく理解しています。また、トラフィックの多い Web サイトでは、数秒のキャッシングでもパフォーマンスとスケーラビリティに劇的な影響を与える可能性があります。または、テーブル「country_usercount」にデータを入力するスクリプトを作成し、1 分おきに実行します。

データが絶対に新鮮でなければならない場合は、カウントを更新するロジックをアプリケーション層コードに含めます。これは少し醜いですが、デバッグは簡単で、予測どおりに動作します。そのため、ユーザーの出身国を示すイベントが発生するたびに、アプリケーション コードから country_usercount テーブルを更新します。

私がトリガーを嫌いな理由は、それらが恐ろしい、再現が難しいバグやパフォーマンスの問題につながる可能性があるからです。これらの集約された事前計算済みフィールドがいくつかあり、それぞれにトリガーを作成すると、多くの予期しない問題が簡単に発生する可能性があります。データベース活動。

于 2013-05-31T20:22:16.533 に答える