2

下の画像は私がこれまでに持っていたものです。

私がこれまでに持っているもの

デザイン

エミッタ テーブル

エミッターには、場所 (x と y に関して)、ID、レベル、およびこの情報が最後に更新された日時などの独自のプロパティがあります。さらに重要なことに、エミッターはどのクランメンバーでも防御できます。エミッターは、そのクランのメンバーによってのみ防御できます。1 つのエミッターを複数のプレイヤーが防御できます。

プレイヤーズテーブル

というかクランメンバー。このテーブルには、特にプレーヤーに関する情報が含まれています。これには、x と y に関する位置情報と、そのプレーヤーに関するその他の情報も含まれています。(おそらくここにも lastupdated を追加します) 1 人のプレイヤーが複数のエミッターを防御できます。

Emitter_Player 結合テーブル

このテーブルには、emitter_player の組み合わせが 1 つ含まれています。(そのような関係が 1 つ存在する場合) まず、これがエミッターとプレーヤーの間の適切な関係であるかどうかを尋ねさせてください。私はそれが多対多になると考えました。さて、私はこれを自分で簡単に行うことができ、この結合テーブルに防御ポイントを追加するだけです (私が本当に気にかけているのは、特定のエミッターでプレイヤーがどれだけの「防御」を持っているかです)。これも正しいことですか? ただし、「最初から正しく実行」し、プレイヤーがこのエミッターを防御している特定の各ユニットに関する情報を追加したいと思います。

単位表

このテーブルには、ゲーム内のすべてのユニットに関する情報が含まれています。このテーブルには、ユニット ID と、関連する防御値と攻撃値が含まれています。このテーブルが挿入されることはめったになく、挿入された場合 (新しいユニットがゲームに追加された場合) は手動で更新されます。

問題

デザインの修正

エミッターには、プレイヤーの外部にユニットは含まれません。プレーヤーは、エミッター内のすべてのユニットの所有者でなければなりません。したがって、エミッターとユニットの間に関係はありません。また、プレイヤーはエミッターの外側にユニットを持っている可能性がありますが、この例は気にしません。エミッターにあるユニットだけを気にします。したがって、Emitter_Player 結合テーブルと Units テーブルの間に多対多の関係があると考えました。この背後にある私の推論は、Emitter_Player の組み合わせは簡単に多くの異なるタイプのユニットを持つことができ、1 つのタイプのユニットが多くの異なる Emitter_Player の組み合わせに含まれる可能性があるということです。

情報の挿入

結合テーブルが 2 つあるため、このデータベースに情報を挿入する方法について非常に混乱しています。

情報の照会

繰り返しになりますが、このデータベースから情報にアクセスする方法が非常にわかりません。

目標

グラフ

最終的には、(プレーヤーとエミッターの両方から) 時間の経過に伴う進行状況を示すグラフを作成したいと考えています。これをどのように照会するかはわかりません。

毎週の変更

プレイヤーが先週から進歩したか、進歩を失ったかをお知らせしたいと思います。(そしてこの場合、レビューのためにフラグを立てます)

結論

できる限り詳しく書いてみましたが、他に情報が必要な場合はお知らせください。私はこれをすぐに終わらせたいと思っていますが、それ以上のアイデアは本当に完全に失われています.

4

1 に答える 1

1

あなたはかなりまともなスタートを切っていますが、いくつかの提案をお勧めします:

emitters_has_players_has_unitsテーブルをテーブルに統合できるようですemitters_has_playersunit_idの主キーに 3 番目のコンポーネントを作成するだけemitters_has_playersです。

ここに画像の説明を入力

quantityまた、特定の関連付けに列を追加したことにも気付くでしょうemitter-player-unit。これは、特定のプレイヤーが特定のエミッターに対して持っている特定のユニットの数を追跡するために必要です。

また、データベース全体で一貫した列名を維持することもお勧めします。最初に id 列に名前を付けた方法はかなり長いものでした (接頭辞として完全なテーブル名が含まれていたため)。


上記の設計をクエリする方法の例を次に示します。

-- Get all associated emitters of a particular player
SELECT a.*
FROM   emitters a
JOIN
(
    SELECT DISTINCT emitter_id 
    FROM emitters_has_players 
    WHERE player_id = 1
) b ON a.emitter_id = b.emitter_id

-- Get all players associated with a particular emitter
SELECT a.*
FROM   players a
JOIN
(
    SELECT DISTINCT player_id 
    FROM emitters_has_players 
    WHERE emitter_id = 1
) b ON a.player_id = b.player_id

-- Get the count of players for a particular emitter
SELECT COUNT(DISTINCT player_id) AS player_count
FROM   emitters_has_players
WHERE  emitter_id = 1

-- Get all units associated with a particular player-emitter association
SELECT b.*
FROM   emitters_has_players a
JOIN   units b ON a.unit_id = b.unit_id
WHERE  a.emitter_id = 1 AND a.player_id = 1

-- Get the defense points of a particular player-emitter association
SELECT   SUM(b.averagedefense * a.quantity) AS total_def_pts
FROM     emitters_has_players a
JOIN     units b ON a.unit_id = b.unit_id
WHERE    a.emitter_id = 1 AND a.player_id = 1

-- Create a new player-emitter-unit association
INSERT INTO emitters_has_players 
VALUES (1,1,1,1) -- Where the fourth "1" is the quantity of units initially.

-- Player adds on one more of a particular unit for a particular emitter
UPDATE emitters_has_players
SET    qty = qty + 1
WHERE  emitter_id = 1 AND
       player_id  = 1 AND
       unit_id    = 1
于 2012-07-29T05:30:56.447 に答える