2012-03-03 3 views
0

私は他のデータと一緒に約20のフィールドにスコアをつけたり、それを評価する評価システムを持っています。この問題は設計上の問題が多いかもしれませんが、ケーキはapache2がCPUを急上昇させる原因になります。CakePHP複数の外部キーを使用したパフォーマンス

私は単純なID、名前である推奨と呼ばれるテーブルを持っています。このテーブルは、このような何かが移入されます:

1 - 正しい 2 - 不正な 3 - NAレビュー・テーブルが推奨テーブルへの外部キーのフィールドの数を持ってい

- 4がありません。

フィールド1 - Field20参照提言ID

私が見るものは、すべてのページリクエストは、私が参照しますページを打っていないよ場合でも(apache2のはどこでも50から90パーセントのCPUからの消費)CPUスパイクということですレビュー。

これは、ケーキがモデルバインディングを処理する方法と関係があります。私は列挙型のようなものを使うことができましたが、それは柔軟性がありません。

ケーキがApacheを狂ったようにしている理由について、より良いデザインやデバッグ方法についてのご意見はありますか?

var $name = 'Review'; 
var $actsAs = array('Containable'); 

var $validate = array(
    'service_request' => array(
     'minLength' => array(
      'rule' => array('minLength', 8), 
      'message' => 'Enter a valid Service Request Number' 
     ), 
     'maxLength' => array(
      'rule' => array('maxLength', 8), 
      'message' => 'Enter a valid Service Request Number' 
     ), 
     'numeric' => array(
      'rule' => 'numeric', 
      'message' => 'Enter a valid Service Request Number' 
     ) 
    ) 
); 

var $belongsTo = array(
    'Employee' => array(
     'className' => 'Employee', 
     'foreignKey' => 'reviewer_id', 
    ), 
    'Reviewer' => array(
     'className' => 'Employee', 
     'foreignKey' => 'reviewer_id' 
    ), 
    'Reviewee' => array(
     'className' => 'Employee', 
     'foreignKey' => 'reviewee_id' 
    ), 
    'Rating' => array(
     'className' => 'Rating', 
     'foreignKey' => 'rating_id', 
    ), 
    'SrSummary' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_summary' 
    ), 
    'SrProduct' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_product' 
    ), 
    'SrVersion' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_version' 
    ), 
    'SrRelease' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_release' 
    ), 
    'SrComponent' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_component' 
    ), 
    'SrTechnicalProblem' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_technical_problem' 
    ), 
    'SrCommunicationOwner' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_communication_owner' 
    ), 
    'SrCommunicationGroup' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_communication_group' 
    ), 
    'SrOwnerGroup' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_owner_group' 
    ), 
    'SrOwnerGroupGeo' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_owner_group_geo' 
    ), 
    'SrStatus' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_status' 
    ), 
    'SrSubstatus' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_substatus' 
    ), 
    'SrSeverity' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_severity' 
    ), 
    'SrPriority' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_priority' 
    ), 
    'SrHwPlatform' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_hwplatform' 
    ), 
    'SrBuild' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_build' 
    ), 
    'SrSerial' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_serial' 
    ), 
    'SrManualSerial' => array(
     'className' => 'Recommendation', 
     'foreignKey' => 'sr_manual_serial' 
    ), 
    'Note' => array(
     'className' => 'Note', 
     'foreignKey' => 'note_id' 
    ), 
    'Timing' => array(
     'className' => 'Timing', 
     'foreignKey' => 'timing_id' 
    ) 
); 
+0

あなたが推測しているように聞こえます。ログの内容を確認するためにログを確認しましたか? –

+0

私は推測していない、私は離れてアプリケーションを取って、一枚ずつそれを再構築した。私はすでに強い疑いを持っていました。レビューモデルの推奨テーブルに$ belongsToの関連付けを削除した場合、問題は解決しません。私はまた、私のApacheのログを見てきましたが、何も問題として際立っていません。 – Jeff

+0

あなたのポストでは、「ケーキがモデルバインディングを扱う方法と関係があると思います」と言われました。とにかく、問題が起こっていると推測できるところでいくつかのコードを共有できますか? –

答えて

0

すべてのクチコミを参照しているコントローラがあります。必要がないときにデータをプルするときは、関連付けを無効にする必要があります。コードは表示されていませんが、クエリを実行する前にこのように表示されます。

$this->Model->recursive = -1; 
+0

私はこれを試しましたが、違いはありません。私が行うことができるのは、モデルの関連付けを削除し、必要なときにのみbindModelを使用することですが、このモデルにアクセスするときにはまだパフォーマンスが低下します。ケーキは同じテーブルの複数の関連をうまく処理していないようです。私はxdebugを使って何かをさらに突き止めることができるかどうかを調べようとしています。 Authが潜在的に問題を引き起こすような追加検索を行っていると思ったかもしれませんが、Authを完全に無効にすることでそれを排除しました。誰か他の人がこのようなことを見たことがあるなら、他のアイデアがあれば教えてください – Jeff

0

あなたのサイトをデバッグすることができないと難しいですが、いくつかのことがあります。

まだDebugKitを使用していない場合は、取得してください。それから、実行しているmysql問合せのすべてと、どれくらい時間がかかるかを簡単に見ることができます。

CPUスパイクは、あまりにも多くの情報(つまり、あまりにも多くの関連データ)を引き出すクエリを実行することと関連している可能性があります。実行中のCakeのバージョンに応じてDebugKitの正しいバージョンを入手し、すべてのクエリと実行にどれくらいの時間がかかるかを確認してから、関連や再帰レベルを微調整してください。余分なデータ。

(あるいは、あなたは、特定のクエリが問題である知っているポイントを得るが、投稿、なぜ理解できない場合に、別のStackOverflowの質問など)


無関係注:

クチコミで行っている関連付けの種類を設定する「通常の」方法は、レビュー表に'foreign_key''model'フィールドを設定してから、関連付けを設定します。 this:

var $belongsTo = array(
    'Employee' => array(
     'className' => 'Employee', 
     'foreignKey' => 'foreign_key', 
     'conditions' => array('Review.model' => 'Employee') 
    ), 
    //... 

このように、別のモデルを追加した場合、別のフィールドをレビューテーブルに追加する必要なく、リンクすることができます。

+0

ありがとうDave、私は間違いなくDebugKitをチェックします。今のところ、Recommendationの$ hasManyを削除するだけで問題は解決しました。そのモデル/コントローラから関連データを引き出すことは決してないので、実際には必要ありません。あなたが提供している関連付けの例に完全に従っているかどうかはわかりません。 – Jeff

+0

Jeff - 基本的に、モデルごとに別々のフィールドは必要ありません。model/foreign_keyフィールドを使用して、レビューが関連付けられているアイテム/モデルを判断します。 – Dave

+0

Jeff - DebugKitはほぼ必須です。私が知っている人はすべて、新しいプロジェクトを開始するときにデフォルトで取得します。一度それを使用すると、あなたはそれなしでどのように住んでいたのだろうと思うでしょう。 – Dave