0

MySQL を使用して PHP でデータを保存する RPG の変更を行っているため、最適化のヒントを探していました。

1 つの一意のテーブルを使用して、すべてのユーザー情報を一意の ID ごとに列に格納しています。ユーザーごとに (多数の?) データを格納する必要があります。武器やその他の情報。

たとえば、'text' 値を持つ 1 つの列に武器を格納する方法として、explode と implode を使用しています。それが良い習慣かどうかはわかりませんし、何千人ものプレイヤーが大量の UPDATES 、 SELECT などのリクエストを実行した場合にパフォーマンスの問題が発生するかどうかもわかりません。

武器とそのすべての情報を保存するには、ジャンクション テーブルの方が適している可能性があると読みましたが、explode メソッドで要求したよりも優れた情報が得られるかどうかはわかりません。

つまり、すべての武器を別のテーブルに格納し、各武器にその情報 (各武器にはさまざまな列などの情報があります。メインの爆発内で複数の爆発を使用します) とその武器のユーザー所有者を特定する必要があります。武器を 1 つの列に配置するだけではありません。

少なくとも 100 個のアイテムを保存することができます。別のテーブルでユーザーごとに 100 個のレコードを作成し、列を呼び出して爆発を使用するよりも常にそれらすべてを呼び出す方が良いかどうかはわかりません。

また、自分のスキルと知識を向上させて、できる限り最高のパフォーマンスの MySQL データベースを作成したいと考えています。

誰かが私に何か教えてくれることを願っています。

ありがとう、そして私のばかげた英語の文法でごめんなさい。

4

3 に答える 3

2

ほとんどの場合、テーブルデータを正規化することがベストプラクティスです。このルールにはいくつかの例外がありますが(特に非常に大量のデータベースの場合)、テーブルを適切に正規化してインデックスを作成する方法を最初に理解するまでは、これらの例外について心配する必要はありません。

通常、実際のオブジェクトとそれらの相互関係を模倣するようにテーブルを配置するようにしてください。

したがって、あなたの場合、ユーザーがいます-それは1つのテーブルです。各ユーザーは複数の武器を持っている可能性があります。これで、武器テーブルができました。複数の異なるユーザーが同じ武器を持っている可能性があり、各ユーザーが複数の武器を持っている可能性があるため、それらの間には多対多の関係があります。したがって、ユーザーIDを武器IDに関連付けるだけのテーブル「users_weapons」などが必要です。 。

ここで、ユーザー全員が鎧を持つことができると言います。ここで、armorテーブルとusers_armorテーブルを追加します(これも多対多である可能性が高いため)。

ゲームのさまざまな側面について考え、それらの間の関係を理解し​​てみてください。実際に機能を実装するためのコードを作成する前に、データベーステーブルでこれらの関係をモデル化できることを確認してください。

于 2012-12-14T18:31:50.137 に答える
0

すべての人が言ったように、通常、正規化されたデータベース構造から始める必要があります。パフォーマンスが問題なければ、何もする必要はありません。

そうでない場合は、さまざまなことを試すことができます。

  1. 動作が遅いクエリを見つけて最適化します。
  2. クエリの非正規化 - 結合によってパフォーマンスが低下することがあります。
  3. アプリケーションで使用されるデータ アクセス パターンを変更します。
  4. データをファイル システムに保存するか、NoSQL/ポリグロット永続化ソリューションを使用します。
于 2012-12-14T18:54:31.807 に答える
0

はい、1 つではなく複数のテーブルを使用することをお勧めします。パフォーマンスをデータベース化する方が優れており、理解しやすく、維持しやすく、使用も簡単です。

1 人のユーザーが複数の機能を備えた複数の武器を持っているとします (ただし、すべての武器の中で一意ではありません)。そして、ゲームの 1 つの場所で、1 つの特定の機能の価値を知る必要があるだけです。

  • あなたの方法でそれを行うには、ユーザーテーブルでユーザー行を見つけ、列をフェッチし、それを数回展開する必要があります。そこに値がありますが、それを変更して保存したい場合はさらに複雑になります。

  • より良い方法は、ユーザーの詳細 (ログイン、パスワード、電子メールなど) 用の 1 つのテーブル、ユーザーの武器 (武器の名前、画像など) を保持する別のテーブル、および保持されるすべての機能、武器の特別な力を保持するテーブルを用意することです。すべての武器のすべての可能な機能を追加のテーブルに保持することもできます. このようにして、ユーザー テーブルからユーザー ID を既に知っている場合、SQL クエリで 2 つのテーブルを結合するだけで、ユーザーの特定の武器の機能の値を取得できます。

テーブルの疑似スキーマの例:

users
    user_id
    user_name
    password
    email

weapons
    weapon_id
    user_id
    weapon_name
    image

weapons_features
    feature_id
    weapon_id
    feature_name
    feature_value

そして、データベースのテキストフィールドで順序付けられたデータを本当に使用したい場合は、それをエンコードしJSONますserialize。この方法では、爆発して内破する必要はありません。

于 2012-12-14T18:15:11.437 に答える