4

アプリケーションを開発していて、現在のデータのスナップショットを取りたい状況に遭遇しました。

たとえば、このアプリケーションでは、ユーザーはさまざまな統計を持ち、一致を入力できます。試合での順位は、統計によって異なります。試合が決定されると、アプリケーションはユーザーの現在の統計をすべて取得し、ポイントを決定して誰が勝つかを確認します。

試合が終わった後、ユーザーが過去の試合を表示できるようにしたいのですが、試合時の参加者のポイントを表示したいときに問題が発生します。次のような構造の配列を格納しても問題ないと思います。

array(
 array(username, points),
 array(username, points),
 etc.
)

通常はデータを正規化するのがベスト プラクティスですが、この状況では次のようになります。

  • 試合には225人の参加者がいる可能性があります。
  • データは更新されることはなく、読み取られるだけです。
  • データベースの配列構造に含めると、バックエンド コードで配列を作成する時間を節約できると思います。
  • 編集: データは永続的ではありません。試合記録は、試合終了から7日後に削除されます。

このソリューションで問題が発生するかどうか、誰か教えてもらえますか?


編集

配列をシリアル化した後にデータを保存するので、データベースには「一致」というテーブルがあり、「結果」という列があります。

この列の行には、シリアル化された配列が含まれます。したがって、配列が次のように見える場合:

$array["a"] = "Foo";
$array["b"] = "Bar";
$array["c"] = "Baz";
$array["d"] = "Wom";

次に、データベースの行は次のようになります。

a:4:{s:1:"a";s:3:"Foo";s:1:"b";s:3:"Bar";s:1:"c";s:3:"Baz";s:1:"d";s:3:"Wom";}
4

2 に答える 2

1

このソリューションは短期的には問題を引き起こしませんが、最終的には、ユーザーがプレイしたすべてのゲーム、または最高得点のゲームを表示する機能を追加したいとします...このデータをアクセスできない元に持っています-sql array では、これらの機能を使用できません。

次のような表が理想的だと思います。

CREATE TABLE game_scores(
    id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    game_id int,
    user_id int,
    final_score int,
    KEY(game_id),KEY(user_id)
)

各ゲームの最後に、そのラウンドをプレイしていたすべてのユーザーの行を、対応するスコアとゲーム ID とともに挿入するだけです。後で、特定のゲームのすべてのスコアを選択できます。

SELECT * FROM game_scores WHERE game_id=?

... または、特定のユーザーによるすべてのスコアを表示します。

SELECT * FROM game_scores WHERE user_id=?

など 楽しんでください!

于 2012-09-16T05:29:21.443 に答える
0

ショーン・ジョンソンへのコメントの資格とともに、質問で概説したユースケースに本当にコミットしている場合、私はあなたのアプローチに問題はないと思います.

履歴情報をマイニングできるようにする可能性があると思われる場合は、データを正規化することを提案することでそれを修飾するかもしれませんが、配列をデータベースにダンプすることで、(比較的言えば) 長期間存続するキャッシュの種類を作成できる可能性があります検出。つまり、両方の形式で保存しますが、概説したユースケースのメインラインは配列形式にヒットするだけですが、必要に応じてクエリ可能な形式でデータを保持できます。

于 2012-09-16T05:42:06.620 に答える