web-dev-qa-db-ja.com

ユニバーサルデータベースドライバークラスの設計

しばらく使用している自作のMVCフレームワークがあり、それはうまく機能していますが、ORMクラス用にアップグレードすることを計画しています。これまでのところ、呼び出されている関数に応じてステートメントを作成することによってのみSQLデータベースをサポートしています。 ORMクラスには、フィールドの構造と検証、計算されたフィールド、インデックス、および結合されたクラス(関連付けの場合、1-11-**-1および*-*)、そしてデータを選択し、データベース内の関連する行をフェッチするための十分な機能を提供します。

しかし、XML、LDAP、NoSQLデータベース(MongoDBなど)をサポートするように拡張したいと思います。これを実装するための私のアイデアは、ORMクラス内の関数を変更して、共通の形式で(データベースタイプごとに)カスタムドライバーと対話することです。残念ながら、これらの他の形式を使用して、あらゆるタイプのORMで使用できるインターフェイスクラスを適切に設計するのに十分な経験がありませんでした。

では、例を挙げて学ぶことができるように、これらすべてのデータベースタイプをサポートするユニバーサルデータベースドライバーはありますか?

私が作業している現在のインターフェースは:

interface DBDriver {
  function connect($Host, $un, $pw, $persist = false);
  function disconnect();
  function selectDB($db);
  function charset($charset);
  function insert($table, $values);
  function select($table, $fields, $joins, $where, $group, $having, $order, $limit);
  function update($table, $where, $values, $where, $order, $limit);
  function delete($table, $where, $order, $limit);
  function transactionBegin();
  function transactionCommit();
  function transactionRollback();
}

しかし、これはSQLステートメントの作成には十分ですが、XMLやNoSQLなどの他のメソッドには不十分であるか、場合によってはやり過ぎかもしれないのではないかと心配しています。

5
topherg

それは非常に抽象的であるため、何の役にも立ちません(分析麻痺/抽象化の不作為)。最善の方法は、CRUD/BREAD/etcのインターフェースを定義し、必要に応じてそれらを実装することです。 PHP 5.4を使用している場合は、トレイトを利用して、共有の動作のためにドライバを少しずつ準備することができます。

interface Create { }
interface Read { }
interface Update { }
interface Delete { }
interface Browse { }
interface Edit { }
interface Add { }
interface CRUD extends Create, Read, Update, Delete { }
interface BREAD extends Browse, Read, Edit, Add, Delete { }
interface Transactional { }
4
R Y