0

私はアチーブメントシステムのデータベースを作成しています(Blizzardゲームで見られるようなものです)。ゲーム内のすべてのアチーブメントの現在の進行状況を表示するGUIが必要です。つまり、GUIにデータを入力するには、ユーザーのすべてのアチーブメントの進行状況を照会する必要があります。私はおよそ100の成果を持つことを計画しています。

これは設計上の問題を引き起こします。最大100ビットフィールドの進行状況をクエリするためのデータベースとクエリコードを設計するための最良の方法は何ですか?

強引な方法は、アチーブメントの行全体を取得してから、行の各フィールドに対してハードコードされた文字列比較を実行して、処理しているアチーブメントを判別することであるように思われます。

別の可能な解決策は、テーブルの列インデックスに基づいて大きなswitchステートメントを作成し、各ケースの各アチーブメントを処理することです(テーブルを変更しないか、多くのC ++コードをリファクタリングする必要があります)。

私はあなたたちがこれのために持っているかもしれない他のデザインを聞いて興味があります。ありがとう!

4

2 に答える 2

1

3つのテーブルを使用してソリューションを構築することをお勧めします。これらのテーブルは、users、achievements、およびuser_achievementsです。ユーザーは、usersテーブルのu_idで識別されます。アチーブメントは、アチーブメントテーブルのa_idで識別されます。次に、user_achievementsテーブルに、ユーザーを識別するためのu_idと実績を識別するためのa_idを含む行を挿入することにより、ユーザーの実績を追跡します。user_achievementsテーブルには、特定のユーザーのそのアチーブメントの完了率を指定する列も含まれます。

于 2012-09-06T03:50:19.920 に答える
0

この質問に出くわしました。5歳ですが、おそらく誰かが次のアプローチに興味があるでしょう。

  • アチーブメントは通常、数値に分類されます(名前、各アチーブメントの説明などの残りの部分は、DBの肥大化を回避するために、サイト/アプリコアに配置できます)。
  • 簡単に言えば、私たちはFBではなく、それらのために個別のテーブルを必要としないので、「users」テーブルに1つの列を追加するだけです。「Achievements」はvarchar(50)です。括弧内の数値(50)は、この列に対する実際のニーズ(つまり、格納されるデータの量)によって異なります。
  • したがって、[実績]列の各セルに数値シーケンスが含まれることになります:10982039482084109384

この数字の行を左から右に次のように読みます。ユーザーが「1098プロフィールビュー」に到達した、「2039いいね」を受け取った、など。 、次に125、次に2039(2桁、3桁、4桁-または別の方法は、達成ごとに最大桁が4であることがわかっている場合、0025、0125、2039を使用することです)。しかし、それでも、区切り文字、つまりコンマを使用することにしたとしましょう。

1098,2039,4820,8410,9384

次に、データが必要になったら、特定のユーザーIDに属する実績を選択し、その後(セパレーターを追加した場合)

explode (',', $array)

次に、サイトのphpコアは、最初の4桁が「プロファイルビュー」を表すことを認識します。これは、プロファイルビューのレベル10バッジ(100ビューの場合は1バッジ)があることを意味します。

その上で、SQLクエリをさらに必要とせずに簡単に操作を実行できます。たとえば、ユーザーがレベル20バッジの達成の進捗状況を知りたい場合、次のように表示します。彼の進捗状況は1098/2000(または55%)です。

その際、アチーブメントの説明、名前、レベル情報はサイトコアに保存され、パーセンテージは外出先で計算されます。

論理が明確であり、そこにあるコミュニティのany1に役立つことを願っています。

乾杯!

于 2017-08-03T08:18:49.353 に答える