2

クエリデータベースを選択するためのリスト要件があります

  1. 安全
  2. 柔軟性
  3. 速い

これはfuelphpのクエリ関数データベースです

  1. ORM(オブジェクトリレーショナルマッパー)

  2. DBクラス(直接クエリ)

  3. クエリバルディング

私の問題

  1. ORM Mapperを使用しているとき、柔軟な点に関して問題があります。私はこれを読んだことがあり ORMはテーブルのフィールドで選択できず、ORMはテーブル内のすべての列をフェッチでき、結合テーブルに大量のデータが渡される場合は、ORMは高セキュリティであり、高速ではありません。誰かが説明できるわけではないかもしれませんが、ORMがすべてのデータをフェッチするため、遅くなると思います。私の意見です。

  2. ダイレクトクエリを使用している場合、SQLインジェクションが可能であるためセキュリティに問題がありますが、ダイレクトクエリを使用すると、クエリデータベースをカスタマイズでき、ORMよりも速度が向上すると思います。

  3. クエリ構築を使用しているときに、2つ以上のテーブルを結合したいときに問題が発生しますが、この関数は引き続きfuelphpで使用できませんが、クエリビルダーを使用すると、直接クエリよりもセキュリティが向上し、速度が向上すると思います。

OK、それは私の意見です。実際には、他のセキュリティよりもセキュリティを優先するため、ORMを使用したいと考えています。これは非常に重要だと思います。

私の質問

  1. この問題に対するあなたの提案は何ですか?
4

1 に答える 1

5
  1. ORMは通常、本質的にわずかに遅くなります。ただし、あなたが言うように、柔軟性はパフォーマンスの犠牲から来る可能性があります。ORMには用途があり、質問に入力したリンクを含め、Web全体ではるかに詳細に文書化されている特定のシナリオに役立ちます。そのため、利点と落とし穴について詳しく説明します。

  2. 直接クエリはSQLインジェクションの影響を受けやすい可能性がありますが、それらをエスケープして安全にすることができます。基本的な例(以下)として、以下をDBクラスに渡すことができます。直接クエリは、ORMとクエリビルダーが必要なSQLを生成できない場合に適しています。ただし、直接クエリを使用すると、ORMまたはクエリビルダーを使用する場合のように、必ずしも別のDBエンジン(MySQLからMongoなど)に切り替えることができるとは限りません。このため、私は個人的に直接の問い合わせを避けています。

    $query = sprintf("SELECT * FROM table WHERE name = '%s'", DB::escape($yourstring));

  3. クエリビルダーは、ORMモデルでは不可能なクエリや、モデルの作成がやり過ぎの場合に適しています。SQLをコンパイルすることでわずかなオーバーヘッドが発生しますが、通常、これはごくわずかです。クエリビルダーは、無制限の数のテーブルを結合できます。join()on()関数を複数回呼び出す必要があります。例えば

    DB::select('*')->from('table')

    ->join('table2', 'right')->on('table2.column', '=', 'table.column')

    ->join('table3', 'right')->on('table3.column', '=', 'table.column')

また、好きなだけ電話をかけることができon()ます。

上記のように、各オプションはさまざまなシナリオに適しています。したがって、必要なときに最適なオプションを選択することが最良のオプションであることがわかります。

于 2012-08-16T09:46:16.993 に答える