0

アプリケーションを構築するためのフレームワークMVCを作成しています。私のアプリケーションでは、いくつかのDBMSを使用する必要があり、そのための準備が必要です。

Active Recordパターンを使用することを考えていますが、「接続」(抽象)が関連付けられています。アクティブレコードは、使用するDBMSを認識していません。そこで、どのDBMSを使用するかを抽象化するためにファクトリメソッドを使用します。

さまざまなクエリ(CRUD)を作成するにはどうすればよいですか?各DBMSには特定のクエリが必要になるためです。

解決できるさまざまなクラス「QueryBuilder」を作成すると思います(DBMSごとに1つのクラス)。

どう思いますか?

4

2 に答える 2

0

DB 間の SQL 構文の違いからさまざまな ActiveRecord オブジェクトを隔離することを意図していると思いますか?

クエリビルダーの設計で意図したものを正確に定義しませんでしたがAddSelection(colName)AddCriteria(colName, ComparisonEnum, value)、 などのメソッドを一度使用しました。それがあなたのアプローチである場合、クエリが十分に小さい/単純な場合、クエリビルダーが機能します. しかし、複雑な結合や内部サブクエリを作成する機能が必要になるとすぐに、そのアプローチで壁にぶつかる可能性があります。

任意に難しいクエリを処理する必要がある場合は、コンバーターまたはトランスレーターを作成するという別のオプションがあります。正規のクエリ形式を定義する場合、各 DBMS 固有の変換は、その正規の形式から DB 固有の構文に変換する方法を認識します。ただし、努力する価値があるようにするには、この機能が本当に必要です。

最後に、他のアプローチは、各 DB の ActiveRecord をサブクラス化することです。したがって、EmployeeRecord クラスがある場合は、それを OracleEmployeeRecord、MySqlEmployeeRecord、MsSqlServerEmployeeRecord などでサブクラス化できます。次に、抽象ファクトリを使用して、適切な ActiveRecord オブジェクトを作成します。

于 2012-09-05T12:18:52.317 に答える
0

この問題を解決するには、DAO レイヤー パターンを使用できます。このパターンは、データベース固有の詳細をクライアントから隠します。DAO が実装する CRUD 操作のインターフェイスを定義できます。

これにより、将来 DB が変更されても、DAO 層のクライアントは変更を気にする必要がありません。

このパターンの詳細については、以下の wiki ページを参照してください。

http://en.wikipedia.org/wiki/Data_access_object

于 2012-09-04T17:09:18.390 に答える