2

私はCodeIgniterとCakePHPでプロジェクトの経験を積んでいます。しかし今、私は両方が不適切な巨大なプロジェクトに取り組む必要があります。私はsymfony1.4を使うことにほぼ決心しています(私のクライアントの要件によれば、2.0はオプションではありません)。

Symfony 1.4でも、私はORMの選択の間で混乱しています:DoctrineまたはPropel?私はいくつかのリンクを通り抜けました。これまでに最もよく見つかったのは、 PHP ORM:Doctrinevs.Propelです。

しかし、これらの比較はすべて最低2年前のようであり、それ以降、世界は大きく変化したことは間違いありません。コーディングスタイルに問題はありません。Active Record、Criteria、DQLなどすべてで問題ありません。私にとって、パフォーマンスはコーディングスタイルがついに来るよりも最も重要です。私は主に、クラスター化されたデータベースの下にある複数のテーブルからの数百万行など、大量のデータを処理する際のパフォーマンスに関心があります。残念ながら、今のところ私の経験は、その問題について独立した決定を下すのに十分ではありません。

誰かがSymfony1.4の下でのPropel/Doctrineのパフォーマンスに光を当てることができますか?パフォーマンス以外に、PHP ORMを選択する際に注意すべき他の注目すべき要素(コーディングスタイルを除く)はありますか?

4

1 に答える 1

9

tl; dr:私は長い間Doctrineを使用していましたが、何か新しいことを始めなければならない場合はPropelを選択します。

これは非常に一般的な質問であり、ほとんど良い答えはありません。しかし、私はあなたに私の見解を与えるだけです。

私は最初のアルファ(そして古いsymfony 0.63)以来Doctrineと協力してきました。DoctrineはPDO(PHPにネイティブ)をサポートし、PropelはまだCreole(ネイティブではない)で実行されていたため、PropelではなくDoctrineを選択しました。クレオールはPDOと比較して非常に遅かった(もちろん)。

最近、Doctrineは魔法の喪失を追加しました。getFieldつまり、あなたはすべてのために、と呼ぶことができfindOneByField、それはあなたが望むものを返すでしょう。独自のゲッターとセッターを作成する代わりに、それは本当に素晴らしいものでした。当時、魔法は本当に流行っていました。

Doctrineを使用してクエリを作成するのは、非常に冗長なPropelの苦痛なCriteriaとCriterionの代わりに、非常に簡単でした。私はDoctrineのファンであり、Propelの代わりにDoctrineを使い始めることをすべての人に勧めました。

その後、Propelは1.3からPDOに切り替え、Doctrineとほぼ同じアプローチでクエリを作成するための優れたAPIを使用できるようになりました。主な違いは、 Doctrineがオンザフライで構築されている間、Propelはすべての魔法のものを生成することでした。それが私が思う最大の違いです。

Propelにはこのコードに魔法はありません。モデルを構築すると、すべてのゲッター/セッター、結合などが生成されます。Doctrineはクエリを実行するときにすべてのことを行います。これは中小規模のプロジェクトでは問題ありませんが、大きくなり始め、遅い解決策になります。また、生成されたクラスでコードを見つけるため、デバッグにも最適です。この場合を処理するグローバルメソッドを見つけるために、クラスからクラスにジャンプする必要はありません。

どちらのORMも動作を使用します。私は行動が大好きです。それらはDoctrineとPropelでは異なる方法で処理されます。Doctrineは依然としてその魔法を使用して、Propelがクラス内の動作からすべてを生成する場所でそれらを処理します(魔法のクラスではなく、生成されたクラスからもう1つのポイント)。

現在のところ、1.2.xブランチがほとんど死んでいるため(前回のリリースは2010年8月24日)。githubで見ることができるように、Propelはまだアクティブで、本当にアクティブです。

私はまだDoctrineを使用していますが、数年前からPropelから多くのことを学びました。私はDoctrineでいくつかの個人的なプロジェクトを構築しました。今日の時点で気が変わったので、新しいプロジェクトを開始する必要がある場合は、Propelを使用して行います。

いくつかのリンク:

于 2012-08-27T11:57:13.290 に答える