12

私は正規化されたデータベースを持っており、外部キー/主キーが 1 つから複数のデータベースを提供しています。

基本的なフロントエンド/バックエンド表示用に PHP でこのデータベースにアクセスする予定です。さて、私の質問は、次の 2 つのクエリの例から来ています。

CREATE VIEW `view` AS
  SELECT
    functiondetails.Detail,
    functionnames.ID,
    functionnames.FunctionName,
    functionnames.Catogory
  FROM functiondetails
    INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID

また

SELECT
  functiondetails.Detail,
  functionnames.ID,
  functionnames.FunctionName,
  functionnames.Catogory
FROM functiondetails
  INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID

私は間違いなく両方を実行したため、クエリ内にエラーはありませんが、私の全体的な質問は次のとおりです。

データベースから大量の情報を常に参照する予定がある場合。新しく追加された情報で常に更新されるビューを作成する方が簡単ではないでしょうか。それとも、実際の php で 2 番目のクエリを実行するほうがよいのでしょうか。例:

$Query = $MySQli->prepare("
  SELECT
    functiondetails.Detail,
    functionnames.ID,
    functionnames.FunctionName,
    functionnames.Catogory
  FROM functiondetails
    INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
")
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);

または私のビューから選択するには?

$Query = $MySQLi->prepare("SELECT * FROM `view`");
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);

では、データベースのクエリに使用するより良い方法はどれでしょうか?

4

5 に答える 5

6

ビュー抽象化レイヤーであり、抽象化レイヤーを作成する通常の理由は、生活を楽にするツールを提供することです。

ビューを使用する大きな利点には、次のようなものがあります。

  1. セキュリティ
    基礎となるテーブルへのアクセスを許可しなくても、誰がビューにアクセスできるかを制御できます。

  2. 明確化
    多くの場合、列ヘッダーは説明的ではありません。ビューを使用すると、返されるデータを明確にすることができます。

  3. パフォーマンス
    パフォーマンスに関して言えば、ビューが悪影響を与えることはありません。ただし、MySQL は具体化されたビューをサポートしていないため、ビューを使用してもパフォーマンスが向上することはありません。

  4. コーディングの容易さ
    ビューを使用すると、複雑なクエリを再利用して、ユーザー エラーの余地を減らすことができます。

  5. 管理の
    容易さ テーブル スキーマが変更されるたびに、作業が楽になります。

    たとえば、売りに出されている家を含むテーブルがあるとしますがhomes_for_sale、後でそのテーブルで、これまでに売りに出された/現在売りに出されているすべての家を処理することにしましたall_homes。明らかに、新しいテーブルのスキーマは最初のテーブルとは大きく異なります。

    からプルするクエリが大量にある場合は、homes_for_saleすべてのコードを調べて、すべてのクエリを更新する必要があります。これにより、ユーザー エラーと管理上の悪夢が発生します。

    変更に対処するより良い方法は、テーブルを同じ名前のビューに置き換えることです。実際のスキーマが変更されていても、ビューは元のテーブルとまったく同じスキーマを返します。その後、必要に応じて自分のペースでコードを調べ、クエリ呼び出しを更新できます。

于 2013-08-28T18:31:48.460 に答える
5

MySQL はビューの結果をどこかに保存し、基礎となるテーブルのデータが変更されると更新されると想定しているかもしれません。MySQL はこれを行いません。ビューのクエリは、クエリの実行とまったく同じです。

ただし、MySQL は基本クエリの結果を一時テーブルに蓄積する可能性があるため、ビューに対してクエリでさらに SQL 句を使用できるため、生の SQL クエリを実行するよりもパフォーマンスが低下する可能性があります。ビューアルゴリズムによって異なるため、「可能性があります」と言います。

MySQL がビューを実行するために「マージ」アルゴリズムまたは「temptable」アルゴリズムを使用する方法については、http: //dev.mysql.com/doc/refman/5.6/en/view-algorithms.htmlを参照してください。

マテリアライズド ビューが必要な場合は、マテリアライズド ビューを維持するFlexViewsというツールがあります。

Flexviews は、MySQL の具体化されたビューの実装です。具体化されたビューを作成して更新するために使用される単純な API が含まれています。Flexview を使用する利点は、マテリアライズド ビューが増分的に更新されることです。つまり、データベース テーブルへの変更を記録する特別なログを使用して、ビューが効率的に更新されます。Flexviews には、これらのログを作成および維持するツールが含まれています。Flexview によって作成されたビューには、JOIN とすべての主要な集計関数のサポートが含まれています。

于 2013-08-28T19:03:26.337 に答える
5

次の場合は、ビューを作成することをお勧めします。

  • 必要な列について確認する
  • ビューを別の場所でも再利用したい
  • あなたは抽象的な方法でコーディングするのが好きです。(技術的な詳細を隠す)
  • インデックスを作成して高速アクセスする必要があります。
  • 少数のユーザーへの特定のアクセス (ポイントはコメントから取得)
于 2013-08-26T12:35:28.503 に答える
4

ビューは、単なる格納されたテキスト クエリです。それに対して WHERE と ORDER を適用できます。実行計画は、これらの句を考慮して計算されます。コードを「クリーン」に保ちたい場合に役立つと思います。覚えておく必要があるのは、ビューを変更するのは少し難しいということです。そのため、列についてよくわからない場合、または列が後で変更される場合は、クエリに固執してください。

性能については同じです!

よろしくお願いします!

于 2013-08-28T18:10:17.327 に答える
3

パフォーマンスに関しては同じである必要がありますが、ビューはいくつかの実際的な理由で優れています。

複数の場所でクエリを使用する場合に新しいバージョンをどこにでもコピーして貼り付けるのではなく、1 つの場所で複雑なクエリを変更することで、複雑なクエリの再利用とリファクタリングを促進するため、私はビューを好みます。

また、ビューに対して更新クエリを実行すると、見た目がすっきりしてシンプルになりますが、異なる基になるテーブルに属するビュー内の複数の列を更新できない場合があることに注意してください。したがって、2 つの異なる列を更新する必要がある場合は、2 つの異なる更新クエリを実行する必要があります。

複雑なデータベース ロジックをアプリケーション コードに組み込むのではなく、それが属するデータベースにオフロードするため、ビューを使用することも理にかなっています。

ビューを使用することの欠点は、データベース管理ツールを用意していない場合、セットアップに少し時間がかかることです。また、多数のビューがある場合は、それらすべてを整理して文書化する何らかの方法を考え出す必要があります。ビューが他のビューから構築され始めると、これはさらに複雑になります。そのため、事前に計画を立てて依存関係を維持する必要があります。

于 2013-08-28T18:23:03.227 に答える