3

バックエンドデータベースとしてInformixを使用するJavaWebアプリケーションがあります。私のスキーマの多くのテーブルには、CLOB、BLOB、およびSERIAL8タイプの列が含まれています。ここで、Informixの代わりにSQL Serverを使用することにしましたが、上記のデータ型を対応するSQL Serverのデータ型に変換する際に問題が見つかりました。たとえば、DB2またはOracleを使用するようになったときにも、同じ問題が発生します。各DBベンダーには独自の関係表現があるため、テーブル間の関係を一致させる際の問題。

タイプに関係なく、列のデータ型を変更せずに、任意のデータベースサーバーと対話できるように、アプリケーションとデータベーススキーマを設計する方法はありますか?DDLUtilsjOOQについて聞いたのですが、自分に適しているかどうかわかりません

4

5 に答える 5

2

わかりました。ここで実行できる抽象化には複数のレベルがあります。

まず、すべてのデータアクセスコードを分離された実装に集中させ、アプリケーションのみであり、基盤となるデータストレージの設計に影響されない形式で必要なデータを提供するインターフェイスを介してのみそれらにアクセスする必要があります。

たとえば、特定の顧客注文からパーツをフェッチする場合は、検索に使用しているメソッドがオブジェクトの「ビジネスID」を処理するメソッドであることを確認してください。リレーショナルデータベースでは実際のIDが長くなる可能性がありますが、 NoSQLのUUID。

これを適用することで、データストレージパラダイムに縛られることなく、フラットファイル、メモリストレージ、NoSQL、および通常のリレーショナルDB実装を自由に切り替えることができます。

次に、HibernateのようなORMを使用してみてください。これにより、ユニバーサルクエリ言語で記述でき、ほとんどの場合、データベース固有の変更のみを構成の変更に制限できます。

第3に、SQLクエリを直接作成する必要がある場合は、データベース固有のクエリではなくANSIクエリを作成するようにしてください。また、これらのクエリがコードの一部ではなく、リソース(つまり、プロパティファイル)の一部であることを確認してください。バイナリを再コンパイルすることなく、必要に応じて微調整および変更できます。

于 2012-07-05T08:13:51.790 に答える
1

これはJavaアプリケーションであるため、データベースの詳細を抽象化するHibernateなどのORMレイヤーに移行できます。

Hibernateは既存の方言で20以上のデータベースをサポートしており、独自の方言を作成することはそれほど難しくありません。従来のInformixSE7.32データベースとの互換性のためにこれを行う必要がありました。

于 2012-07-05T03:11:47.427 に答える
1

あなたがjOOQについて言及したので、私はあなたにそのツールで何が可能で、何が不可能であるかについての洞察をあなたに与えることができます-あなたのニーズに関して。jOOQを使用すると、次のことができます。

  • モデルデータベーススキーマからソースコードを生成します。これらの生成されたスキーマオブジェクトは、SQLダイアレクトに依存しません。これは、モデルデータベーススキーマでベンダー固有の型を使用している場合、一部の型情報が失われる可能性があることを意味する場合があります。
  • さまざまなデータベースで実行されるSQLを記述します。jOOQは、SQL方言固有のものを処理します。多くのjOOQユーザーは、jOOQを使用して、[Oracle、Postgres]、[Oracle、SQL Server、HSQLDB、Sybase]などの組み合わせに対してアプリケーションを実行します。

jOOQでは、次のことはできません。

  • さまざまなデータベース間で互換性を維持するために必要なDDLを処理します。jOOQはDDL抽象化をサポートしていません。ただし、 DdlUtilsはそのための優れたソリューションになる可能性があります。
  • Informixを使用します。公式には、Informixは(まだ)サポートされていません

他の人が指摘しているように、実際に実行したい「SQL」の量によっては、Hibernateの方が適している場合があります。クエリ要件をHQLまたはJPQLに減らす準備ができている場合、Hibernateは以下も処理します。

  • InformixSQLダイアレクトのサポート
  • ドメインモデルファーストアプローチを使用する場合のDDL生成(データベースモデルファーストアプローチのみをサポートするjOOQとは異なります)

HibernateとjOOQを組み合わせて使用​​することもできることに注意してください。この関連する質問も参照してください。

挿入専用/クエリ専用アプリに使用されるORMフレームワーク

于 2012-07-08T14:37:17.057 に答える
0

データベースに依存しないAPI(つまり、JDBC)を使用してコードを記述しますが、SQLは外部テキストファイルに保持します。キー/値の形式が便利です。実行時に、特定のデータベースに必要なクエリをロードします。

于 2012-07-03T21:50:32.773 に答える
0

SQLベースのデータの独立性を実現する唯一の方法は、ANSI SQLを使用することですが、それではアプリケーションの要件に対して十分な機能が提供されない可能性があります。

JDBCを使用してSQLステートメントを外部に保持したとしても、SQLベースのデータベースの独立性を実現することは不可能だと思います。ANSI SQLはその目標に向けた動きだと思いましたが、DBベンダーは、ANSI SQLのスーパーセット、データ型、変数の命名構文など、独自の機能を追加しました。

于 2012-07-05T02:01:57.393 に答える