私はここでいくつかの遅い操作を加速することに取り組んでいます、そして1つのケースはテーブルの親子関係のツリーです。現在、システムはSQLServerで実行されており、調査の結果、一般的なテーブル式を使用すると、複数のクエリを1つにまとめることができることがわかりました。
これまでのところ良いですが、構文はSQLServerに固有であり、(たとえば)Oracleで同じことを行うには、完全に異なる構文が必要になります。
他のRDBMSへの将来の適応を可能にするためにシステムを構築するために何ができるでしょうか?ここでの私の主な関心事は次のとおりです。
- SQLステートメントはコード上に散らばっていて、あるRDBMSの1つのステートメントで可能なことは、別のRDBMSで複数のステートメントを必要とする場合があるため、プログラムロジックでさえ変更が必要になる場合があります。
- 1つのRDBMSにうまくカプセル化できるもの(私は保存された関数を使用してDBの複雑さの一部を隠しています)でさえ、異なるDBに沿って微妙な違いがあるか、まったく利用できません。
これまでのところ、最も単純なSQLステートメントを超えるものはすべて、常にベンダー固有の拡張機能を必要としているように思われるため、いくつかのクラス/格納されたSQLで違いをきちんと隠しておくことは不可能です(抽象化はすでに組み込まれています。しかし、それはDBのより便利な機能の多くも除外します)。
少なくともベンダーの違いによる苦痛を和らげるために、どのような戦略を使用できますか?これは非常に幅広い質問であり、すべてを解決することはできません。しかし、DBがアプリケーションに与える影響を軽減するためのいくつかのポインターとパターンを期待しています。
編集:実装言語はJavaであり、単にORM(Hibernateなど)を使用することは私が探しているものではありません(多かれ少なかれコードベースの約50%を書き直す必要があります)。
EDIT2:私は主に、可能な限り一般的に互換性のある方法でデータベースに詳細をプッシュする可能性を探しています。理想的には、Java部分で使用されるSQLをすべてのプラットフォームで同じにする必要があります(または非常に必要なだけです)構文の違いによるわずかな変更)。私が提供したCTEの例では、移植が必要になったときに機能を関数でも再現できることを期待して、現在それをストアド関数にプッシュしています。
EDIT3:現在、他のRDBMをサポートする差し迫った必要はありません。SQLServerでのみ機能する場合、誰も私を責めることはありません。しかし、可能であれば、Javaコードを特定のDBベンダーに必要以上に結び付けることは避けたいと思います。
EDIT4:いくつかの背景-現在の作業は、システムに機能を追加することです-それが設計も計画もされていなかった機能。要件は、ビジネスマンから少しずつ細かくなり、事前に計画するのは困難です。それぞれの要件自体を解決するのはそれほど難しいことではありませんが、すべてのクエリを詳細に調べないと移植できないものにタグ付けされたものの大きな混乱が蓄積されるのではないかと心配しています。SQLServer自体も、メジャーな新しいリリースごとにさまざまな非互換性を導入しているため、新しいSQLServerに切り替えることでさえ、将来的に大きな障害になる可能性があるのではないかと心配しています(過去に、2005年から2008年にそのようなアップグレードを1回行いました。私が維持しているものについてはスムーズですが、それはすでに私たちのサプライヤーの1つに多くの問題を引き起こしました)。