4

次の画像に示すように、テーブル「キーワード」と「モデル」の間にam:nの関係があるHTML5マルチプレイヤーゲームを開発しています。

データベーススキーム

keyword.idおよびmodel.idはauto_incrementunsignedintでkeyword.keywordあり、一意のインデックスです。
効率を上げるために、関係を管理する方法を探しています。ささいな方法は次のようになります。

  • キーワードがすでに存在するかどうかを確認します
  • はいの場合:更新timesCountしてroundCountからmodel_has_keyword
  • いいえの場合:insert into keywordおよびinsert into model_has_keyword

しかし、同時にプレイするユーザーの数が増えるにつれ、些細な方法が遅くなりすぎるのではないかと心配しています。では、これを行うための最も効率的な方法は何ですか?

StackOverflowを検索しているときに、2つのアイデアに困惑しましたが、どちらも私のニーズに合わないと思います。

  1. INSERT INTO table ON DUPLICATE KEY UPDATE col=val
    処理される場合INSERT INTOは、別のステートメントをトリガーして両方のテーブルに挿入する必要がありますINSERT INTOkeywordmodel_has_keyword
  2. REPLACEステートメント:テーブルキーワードのレコードを置き換えるとid、次の自動インクリメント値が割り当てられるため、テーブルの参照model_has_keywordが失われます。

私は専門家ではないので、ここで何か誤解した場合は訂正してください。

4

1 に答える 1

3

リレーションが存在するかどうかを確認してから、挿入/更新する必要があります。

A.- INSERTクエリをtryブロックで囲み、エラーが発生した場合は、更新クエリを作成します。リレーションが存在しない場合は、すべてのチェックが保存されます...

B.-すべてのINSERTONDUPLICATEUPDATEを作成します。これは「A」の場合とまったく同じように実行されますが、例外について心配する必要はありません。

間違いなくあなたの2番目のアイデアは絶対に間違っています。

キーワード自体が必要なだけなので、テーブルキーワードは作成しません...次に、model_has_keywordを次のように定義します。

CREATE TABLE model_has_keyword (
  model_id         INT NOT NULL,
  keyword          VARCHAR(50) NOT NULL,
  timesCount       INT NOT NULL,
  roundCount       INT NOT NULL,
  PRIMARY KEY (model_id,keyword)
);

次のように更新します。

INSERT INTO model_has_keyword 
  (model_id,keyword,timesCount,$myIntValue) 
VALUES 
  ($model_id,$keyword,0,0) 
ON DUPLICATE KEY UPDATE 
  timesCount=timesCount+1,roundCount=roundCount + $myIntValue
于 2012-05-23T11:06:53.630 に答える