[PHP-users 34841] PHPの実装方法について

aug721 @ gmail.com aug721 @ gmail.com
2009年 11月 16日 (月) 20:04:49 JST


オカムラと申します。

PHPに限った話題でなく恐縮ですが、経験豊富な皆さんからシステムの実装について意見を頂ければと思います。

複数のシステムが連携するサービスが、各システムはデータベースを利用するとします。

システムは
 - 会員システム
 - ブログシステム
 - オークションシステム
 - SNS
 - その他
のように分かれており、各サービスは、会員システムを共有するようなものです。

ブログにSNSの情報を表示したり、その逆といったサービス間の連携も発生します。

このようなサービスを開発する場合、データベースをどのように分け、PHPでどのように実装するのが理想でしょうか?
規模等、その他の要件により色々な考えはあると思いますが、何かしら決まった答えがあるのではと思っているのですが、
自分の考えは下記のような実装です。

1.データベースをサービス単位で分割する
 →規模が大きくなりデータが増えた場合にスケールアウトを容易にするため
  1つのデータベースに全システムのデータを入れるという選択肢もあるが、
  拡張性を考慮して分割する。
  1つのデータベースに全システムのデータを入れるとシステムを横断するような
  SQLを書きやすい等のメリットもあるが、後述する2.の方法でシステムの横断を
  可能とする。

2.データベースを横断して利用できるデータベースユーザを作成する
 →システムを横断するSQL(JOIN)を書きやすくする
  JOINせずにそれぞれのシステムに対してSQLを書きプログラムで処理する方法もあるが
  応答時間を優先するためJOINできるユーザを作成

3.PHPの実装
 システムを横断してコンテンツを提供するため、データベースとのデータ操作を共有
 出来るようシステム単位「データクラス」を作成し、別のシステムからデータ操作をおこなった
 場合でも単一の結果が得られるようにします。
 各システム固有の機能は「処理クラス」に記述し、「実行ファイル」から呼び出します。
 「処理クラス」のメソッドを呼び出す際に、都度たくさんの引数で渡さないで良いように
 「処理クラス」でデータを保持します。

 ファイルは以下のこのように分かれます。

 - データベース基本クラス
  database_base.php
  データベースへの接続、SQL実行など基本的なデータベース処理

 - データクラス
  data_<サービス名>.php
  「データベース基本クラス」を継承し、サービスに応じたSQLを実行する

 - 処理クラス(機能に応じて1サービスに1〜複数ファイル存在する)
  <サービス名>.php

 - 実行ファイル(URL毎に1ファイル)
  hogehoge.php

ここまでは自分として良かったのですが、「処理クラス」から「データクラス」のメソッド
を実行するところでイマイチな実装になってしまいました。

1.「処理クラス」が「データクラス」を継承すれば良さそうですが、複数のサービスの
 「データクラス」を継承するのはどうか?
 システムが増えるたびに継承する「データクラス」が増えるのはあまり良い実装とは
 言えないのではないか。
 そもそもPHPで多重継承に上限がある?

2.「処理クラス」のメソッドを実行する際に必要なシステムの「データクラス」を引数として渡す。

そのシステム構成であれば、このように実装した方が良い、そもそも、そう言う話は○○○でした方が良い等、
アドバイスを頂ければと思います。

よろしくお願いいたします。


PHP-users メーリングリストの案内