2010-12-18 28 views
0

私は、不特定のフレームワーク/システム用の単純なオブジェクト/モデルを作りたいと思っています。データベーステーブルが存在するかどうかを確認する - パフォーマンス?

また、MySQLをデータのバックエンドとして使用したいと考えています。

私の目標は簡単な実装です。構成ファイルを少し変更して基本的にはそれです。

私の問題は、私のモデルを使用しているときにデータベーステーブルが実際に存在することを確認する必要があると私は確信しています - もしそうでなければ、テーブルを作成してください。

私のようなものを考えていた:

<?php 

    class MyObject 
    { 

    public function __construct() 
    { 
     $dal->query("SHOW TABLES LIKE 'MyTable'"); 

     if($dal->num_rows() == 0) 
     $this->_createTables(); 
    } 
    ... 
    } 
?> 

をしかし、私はこのモデルのパフォーマンスが心配だ - 私は私の解決策の効率や、よりよい解決策のいずれかの確認を探しています。

+1

アプリケーションの有効期間内に本質的に1回だけ(テーブルあたり)実行されるステートメントのパフォーマンスが心配ですか? – Tomalak

+0

CRUDishオブジェクトのインスタンス化ごとにテーブルが存在するかどうかを調べたいと思うように見えます。 – scoates

+1

時期尚早最適化はすべての悪の根源です。 –

答えて

2

私の意見では、アプリケーションのニーズに応じて、エラーが発生した場合にのみこの条件をチェックし、テーブルが存在しないと仮定する方がよい場合があります。このようなものは、すべてのインスタンスで余計なクエリを避けることができます(ただし、独自のメソッドにチェックを入れる必要があります)。

public function insert($data, $spiralingToDeath=false) 
{ 
    // (do actual insertion here) 

    if ($this->isError) { 
    // nothing obvious 

    if ($spiralingToDeath) { 
     // recursion check 
     throw new DBException("Tried to create a table and failed."); 
    } else { 
     $dal->query("SHOW TABLES LIKE 'MyTable'"); 

     if($dal->num_rows() == 0) { 
     $this->_createTables(); 
     } 
     // try again: 
     $this->insert($data, true); 
    } 
} 
} 
0

ユーザがエディタで設定を変更し、設定を保存する前にエディタでテーブルレイアウトを変更するように要求します。

1

CREATE TABLE IF NOT EXISTS

+0

質問を書いた直後に私はまったく同じ考えを持っていましたが、パフォーマンスの改善に関して私の質問に実際には答えなかったことに気付きました。しかし、あなたの入力のために、ありがとう:) – Repox

0

例えば、また、あなたは、単に「ショーテーブル」を呼び出して検討する必要があり、その後プライベートVARにクラスレベルでそれをキャッシュするので、あなたは、後で簡単なISSETを行うことができます。

isset($this->tables_cache[$db_name][$table_name]) 

これにより、より多くのテーブルでより良いスケールを実現できます。

これをjson構造体またはシリアライズされた構造体としてファイルシステムに保存し、クラスの__constructにロードして__destructに保存することもできます。

関連する問題