web-dev-qa-db-ja.com

Djangoにクエリ言語のようなデータベースに依存しないSQLがあるべきでしょうか?

注:

  • データベースに依存しないようにし、データベース固有のSQLクエリに変換するDjango ORMがすでにあることは知っています。
  • 物事が複雑になり始めたら、効率を上げるためにraw SQLクエリを記述することをお勧めします。
  • raw sqlクエリを作成すると、使用しているデータベースでコードがトラップされます。
  • また、Django ormだけでは達成できないデータベースの能力を最大限に活用することの重要性も理解しています。

私の質問 :

  • データベース固有の機能を使用するまでは、なぜデータベースに閉じ込められるのか。
  • 例えば ​​:

複数の結合を持つクエリがあり、未加工のSQLクエリを作成することにしました。さて、それは私のウェブサイトをpostgres固有のものにします。 postgres固有の機能を使用していない場合でも、.

データベースのSQLクエリに変換できるfake sql言語があるはずだと思います。 DjangoのORMでも構築できます。したがって、ORMを終了してもデータベース固有ではない場合でも、データベースに依存しないままにすることができます。

同じ質問をJacob Kaplan Moss(対面)に行いました:

  • 彼は、私が気に入っているデータベースを使い続け、その全体的な力に耐えることを勧めました。しかし、私が言うべきことは、私たちがdatabase independentであるべきだということではありませんでした。
  • 私の要点は、データベース固有の機能を使用するまで、データベースに依存しないことです。

説明してください、なぜ実際のSQLの上にfake sqlレイヤーがあるべきですか?

================================

更新:

================================

私の提案:

fake sqlレベルでデータベースの独立性を解決し、その偽のSQLでORMを構築します。したがって、SQLクエリを作成する必要がある場合は、fake sqlを使用します。これは、未加工のSQLであるすべてのデータベースで機能します。そうすれば、自分のデータベースに固有の機能を使用しない限り、データベースに依存しないままになります。

したがって、select * from table limit 10;のようなクエリは、postgresと 'MS-SQL Server'の両方で機能します。

それは賢明ですか?

注:

  • 私はANSI SQLについて話しているのではなく、すべてのデータベースを1つの標準SQLで動作させるためにfake sqlを提案しています。 [db固有の機能をカバーしていない可能性があります]
5
Yugal Jindle

SQL ANSI標準 を探していると思います。

この標準は、大部分のRDBMSに実装されています。

ただし、すべてのRDBMSは、いくつかのことを自分のやり方で行うことにしました。 (単に標準に機能がないか、または別の理由があるためです。LIMITには、たとえばSQL:2008以降のみ同等の機能があります。)

これらのSQL標準との違いをリストアップするには、Webページ全体が必要です。あら、 やった

したがって、あなたに答えるために、このまさに理由により、パフォーマンスを失うことなく(つまり、レイヤーを構築することなく)RDBMSから独立することはできません。 SQL標準実装の違いは、人々にORMを構築させたものです。

6

この場合、YAGNIの原則は重要です。

トピックを決定するときは、特定のデータベースに関連付けられることの利点と欠点を考慮する必要があります。

数千ものデータベースが存在するわけではありません。リレーショナルデータベースの場合、一般的な選択肢はPostgresとMysqlです。また、それらの違いや特徴はよく知られているので、解決しようとしている問題について事前に比較するのは簡単です。

運用環境を管理している場合は、それらの違いを調べて選択してください。

ソフトウェアをエンドユーザーに配布し、エンドユーザーが独自のプラットフォームにインストールする場合など、運用環境の管理下にない場合は、データベースの独立性を目指す必要があります。

データベースに依存しないという説得力のある理由がない限り、面倒であり、長期的にはそうすることを目的とする場合、あなたを悩ませます。この種の状況に対する一般的なアドバイスは、それを行うためだけに物事を行うことではありません。

3
Hakan Deryal