0

私はデータベース設計に不慣れで、プロジェクトのトリガーとビューの選択についてこの質問があります。以下に詳細を示します。

使用データベース:MySQL

Table 1:

Name: - no limit on number of values
Level: - four values are possible - 1,2,3,4
Status: - four values are possible - a,b,c,d

各名前は、レベルとステータスのすべての組み合わせを保持できます (必須ではありませんが、可能です)。

例:

名前:「キング」は、レベル1のステータスa、レベル1のステータスb、……、レベル2のステータスa、レベル2のステータスb……、レベル3のステータスa、レベル3、ステータスb……を保持することができます。 ..

ここで、データベースにクエリを実行して、ネットワーク経由で動作する GUI (Java Swing) を介してユーザーに表示するための計算を行う必要があります。必要な計算は...

  1. 各名前の各レベルの各ステータスの数。例えば:

    キングのレベル1の「ステータスa」の数。キングのレベル1の「ステータスb」の数。キングのレベル1の「ステータスc」の数。キングのレベル1の「ステータスd」の数。キングのレベル 2 の「ステータス a」の数。すぐ....

    名前--- レベル--- ステータス

    キング--- 1 --- a

    キング--- 1 --- a

    キング--- 1 --- a

    キング--- 1 --- b

    キング--- 1 --- b

    キング--- 1 --- 日

    レベル 2 も同様で、別の名前も同様です。名前「King」のレベル 1 のカウントをしたい

このデータを取得するために個別のクエリを実行すると、20 個の名前がある場合、320 個のクエリを実行する必要があります。私はしたくない。ここには2つの解決策があります...

解決策 1. トリガーを作成しました。

表 2 を作成しました。

   Name,Level,a_count,b_count,c_count,d_count
   King  1       3      2      0         0
    xyz   1       ...    ..... ....       ...

元の表 1 が更新されると、それに応じてトリガーがカウントに追加されます。今、私はこの table2 から直接読み取ります。

解決策 2: このデータを表示するビューを作成しました。

名前 -- レベル -- ステータス -- カウント

キング 1 a 3

キング1b2

キング2 ...

後で。

このソリューションを使用すると、常にネットワーク経由ですべてのクエリを送信する必要がなくなります。ビューを一度だけ呼び出すことができます(とにかくすべてのクエリを実行しますが、プログラムから実行する必要はありません)

両方を実装できますが、どちらのソリューションがより効率的かを知りたいです。(フロントエンドを使用して) 各ユーザーの親テーブルに約 2000 行があり、ユーザーは任意の数にすることができます。提案してください。

ありがとう、ラージュ

4

2 に答える 2

0

最後に、さらに調査を行い、トリガーを使用することにしました。理由は以下のとおりです。

Need : 必要性は、ユーザーが望むときにいつでも要約されたデータを取得することです。現在、20 の異なる名前について、ユーザーがデータを要求するたびに 320 のクエリを実行する必要があります。したがって、ここでのポイントは、ユーザーがデータを要求する回数です。私のアプリケーションでは、彼は非常に頻繁にそれを要求します。

したがって、ビューでは、データベースはとにかくすべてのクエリを実行する必要があります。そのため、ユーザーがデータを要求するたびに 320 のクエリを実行することになります。

トリガーあり: 行の更新ごとに 1 つの更新クエリを実行する必要があります。これにより、更新ごとに約 2 つのクエリが実行されます。最大で2000行あり、ユーザーがすべての行を更新するまでに4000のクエリを実行することになります。しかし、ユーザーがデータを必要とするたびに、すべてのデータを取得するためにクエリを 1 つだけ実行します。このようにして、DB に負荷をかけるユーザー (1 つ以上) の要因が最小限に抑えられます。

トリガーとビューを比較して、1 つのものを使用しないことに偏った Web 上の多くの議論を見つけましたが、アプリケーションが DB の負荷を大幅に増加させることなくスケーラビリティを維持する限り、何でも使用できることを学びました。DB の負荷はユーザーの使用量によって決まるため、この "some(x)" はできるだけ小さくする必要があります。

私の理解が間違っている場合は修正してください。喜んで学びます。

ありがとう、ラージュ

于 2013-03-08T07:39:52.367 に答える
0

「このデータを取得するために個別のクエリを実行すると、20 個の名前がある場合、320 個のクエリを実行する必要があります。」

はい。ただし、個別のクエリを実行する必要はありません。 と で COUNT を集計するクエリが 1 つ必要nameです。levelstatus

select name, level, status, count(*)
from your_table
group by name, level, status

詳細をご覧ください

于 2013-03-10T11:00:48.703 に答える