2011-01-02 18 views
1

"不明な"ユースケースや変更を処理するためにデータベーススキーマとアプリケーションコードをできるだけ動的にしたいと考えています。 PHPとMySQLでの開発。 2回はテーブルとカラムの名前を含む私のスキーマ全体を変更しなければなりませんでした。これは開発者がアプリケーションコードに戻り、すべてのSQLクエリとテーブル/カラム名を変更する必要があることを意味します。これを防ぐには、ページの内容、タイトルバーなどの%variable%のような動的なページの場合と同様に、スキーマやPHPの関数やクラスについても何とかできるのですか?このようなすべての変更を再度行うには数週間かかります。動的であれば、1日以内に行うことができます。スキーマとコードを動的にするには?

答えて

2

まず、あなたの幸せな新年があるかもしれません(あなたのコーディングの問題にかかわらず:))。さて、私があなたに提案しようとしていることは、ほぼすべての開発言語に当てはまりますが、OO開発の欠如のためにPHPがこれを最も苦しめていると私は推します。

changinスキーマと関数の主な問題は、アーキテクチャの定義です。堅牢なアーキテクチャを持つために、あなたがする必要があります

  • は、あなたのデータクラスからこれらのclasesで
  • 抽象ビジネス(ドメイン)のクラスをcomunicateするためのインタフェースを作成し、アプリケーション
  • を構成するクラスを識別

PHPを使用しているので、データベースをマッピングするためのORMフレームワークを使用することを検討してください。またはDoctrineという素晴らしいものがあります。あなたのORMフレームワークにあまりにも多く依存することに注意して、あなたのビジネスモデルに変換すると、あなたはチェックアウトすることができますthis blog post私は話題にしました。私は助けることができる

希望、 ダビデは

2

あなたはすべてのスクリプトの先頭に特別なPHPファイルを含めることができ、このファイルには、すべてのテーブルと列の代わりにあなたのコード全体で使用する定義済みの定数を含めることができます名前。次に、テーブルやカラムの名前を変更する必要があるときは、この1つのPHPファイルの1つの場所で変更するだけです。ここで、定数の

を参照してくださいPHPのドキュメント:
http://php.net/manual/en/language.constants.php

あなたが見ることができるように、定数はグローバルスコープに存在します。つまり、すべての関数やクラス内で問題なく使用できます。

"include"(すべてのスクリプトの最初に特別なPHPファイルを読み込むために)の使用についてはすでに知っているでしょう:
http://php.net/manual/en/function.include.php

あなたが動的テーブル名とカラム名を使用して、いくつかのSQLを書きたいのであれば、たとえば、あなたがこれを行うことができます:

定数インサイド。PHP:スクリプト内

define("USER_TABLE", "Users"); 
define("NAME_COLUMN", "FirstName"); 

あなたがこれを行う:

include "constants.php"; 
... 
$sql = "select " . NAME_COLUMN . " from " . USER_TABLE . " where id = ...(etc)"; 

を上記のは、これに変換します。

$sql = "select FirstName from Users where id = ...(etc)"; 

あなたはいつの日か後に、テーブルと列の名前を変更したい場合constants.phpファイルを変更するだけで済みます。

ファイルを含めるこれを使用するスクリプトのすべてを通じて変化を引き起こす自動的 ます
define("USER_TABLE", "DifferentUsers"); 
define("NAME_COLUMN", "DifferentFirstName"); 

$sql = "select DifferentFirstName from DifferentUsers where id = ...(etc)"; 
+1

したがって、「usertableからfirstnameを選択する」というようなクエリは、実際には「企業から企業名を選択」を意味する場合があります。いいえ、私はいつでも検索と置換と再テストの方法をとるだろう。 – Ronnis

+0

それは元のポスターが避けたかったものとまったく同じです。私は彼がそれを望むのとまったく同じ答えをここに提供しました。さらに、ここでの他の答えは時間とスキルの深い投資を必要とし、最初からすべてのプロジェクトを完全にやり直すことを意味します。将来的には、これらの他の戦略やアーキテクチャを検討しながら、彼の価値があることに同意します。 – OCDev

2

開発のどの段階であなたを、次のとおりです。

新しい翻訳結果が今のように見えるのでしょうか?そして、名前の再設計や名前のリファクタリングなどについて話していますか?いくつかの考え:

  1. あなたはおそらくデザインがシェイプアップかもしれない方法の感触を得るために遊んで、開発の初期段階にいる場合、それはあなたの概念実証のアプリケーションを書き換えるのが自然です。

  2. デザインが実際に変更されている(ユーザーの要件が成熟しているため、実生活で起こっている)場合は、古いアプリケーションが古くなり、とにかく書き換えなければなりません。

  3. 本当に名前を変更していて、本当に再設計していないのであれば、本当にそれを行う必要がありますか?表や列、クラスや変数などの内部の名前は、ユーザーが認識できる用語が変更されただけで更新する必要はありません。

基本的には、あなたのようなダイナミックなデザインが、私をビルドするための貧弱な基盤であると私は思います。

しかし、それはあなたが柔軟なデザインを持つことはできないと言っているわけではありません。最も単純なケース:データベースを約3番目の正規形に正規化すると、一般的に、列を追加したり、新しい関係を作成したりできるため、柔軟性が向上します。よく定義されたインターフェースを持つ小さなクラスでも同じです。

強力なデザインでシステムを構築する場合は、柔軟な設計(ハードワーク)を行い、プッシュボタンソリューションを探すことはお勧めしません。 (私はあなたの質問を理解しているかどうか疑問に思います...)

関連する問題