1


1

これらのテーブルを含むMySQLデータベースがあります。

セッション-------- sessionid(INT)
[courseid (INT)]
[locationid (INT)]
[comment (TEXT)]

日付----- dateid(INT)セッションID(INT)日付(DATE)

コース-------
...

場所---------
...

各セッションには固有のsessionidがあり、各日付には固有のdateidがあります。 しかし、セッションは可変数の日付にまたがることができるので(必ずしも連続的ではないため)、日付は必ずしも固有のsessionidを持つ必要はありません。

それぞれの全行を選択することは、単にsessionidのテーブルを結合することの問題です。 ただし、特定のコースIDの行セットを返す方法を探しています。その行セット内の各行は場所を表し、別の行セットには単一のセッションが含まれ、各セッションにはすべての行セットが含まれます。そのセッションの日程:

コース開催地セッション開催日開催日セッション開催日開催日開催地...

これは、Zend Frameworkを使用してPHPからこのデータベースにクエリを実行しているためです。これは、オブジェクト指向の方法で行と行セットを操作するための優れたインタフェースを備えています。

最終的に、私は最初にコース、次に場所、そして日付の順に整理されたビューに 'スケジュール’を出力しようとしています。 理想としては、場所として各行を繰り返し、次に各場所について、各セッションについて繰り返し、さらに各セッションについて各日付について繰り返すことができます。

私はこれを、すべての場所、セッション、および日付について別々に照会することによって行うことを考えています。 次に、各行セットを配列に変換し、各セッション配列をロケーション配列のメンバーとして追加し、各日付配列をセッション配列のメンバーとして追加します。

ただし、これは非常に気の利いた作業ではなく、オブジェクト指向の方法で行を処理することはできません。

私はどちらかがあったかどうか疑問に思いました:

a)このデータを表現するためのより良いテーブルスキーマ。

b)私が気付いていないsqlクエリ。

c)Zend_Dbのメソッドで、行セットを行セットに割り当てることができます。

私がどこにもはっきりしていないかどうか私に知らせてください、そして事前に感謝します。

(これは毎日のwtfにはつながらないことを私の指を交差させる…​)

2 Answer


2


複数のテーブルからのデータを処理しなければならないときに、Zend Frameworksのデータベース抽象化クラスを使用する際に多くの問題に遭遇しました。 実行されるクエリの数と生成されたすべてのオブジェクトのオーバーヘッドにより、ホスティングサーバーに問題が生じました。 それ以来、私はすべてのデータを集めるためのクエリーを書くことに戻り、そしてデータを見て私のディスプレイを構築しました。 抽象化レイヤを使用するのは美しくもなく、オブジェクト指向でもありませんが、データがいっぱいのテーブルを表示するためだけにPHPスクリプトをディスクにページ化することもしません。

Steveがあなたが最終的にどのような解決策を取ったとしてもベンチマークについて言及しているように、私はあなたのメモリ使用量についてもプロファイルしたいと思います。


1


このシナリオに対処するには、Zend_Db_Tableのリレーションシップ機能を使用します。 セッション、日付、コースなどのためのテーブルラッパークラスを作成する必要があります。 現在、クエリにZend_Db_Aadpterを使用している場合

これは、データセットごとに個別にクエリを実行するという前述のアプローチとそれほど変わりはありませんが、特定のレコードに適切な関連データを取得するための直接的なオブジェクト指向インタフェースを提供します。

この方法を使用する場合は、ベンチマークを実行することをお勧めします。これは、多くのクエリを実行する可能性があるためです。