4

ネストされたセットを使用してみましたが、複数のツリーやその他の多くの問題を処理するときに、それらを維持するのが非常に困難になります。PHPのSPLライブラリにこれを試してみたいと思います(ところで、PHP 5.3、MySQL 5.1 )。

与えられた2つのデータセット:

グループ:

+-------+--------+---------------------+---------------+
| id    | parent | Category Name       | child_key     |
+-------+--------+---------------------+---------------+
| 11133 |   7707 | Really Cool Products| 47054         |
|  7709 |   7708 | 24" Monitors        | 57910         |
|  7713 |   7710 | Hot Tubs            | 35585         |
|  7716 |   7710 | Hot Dogs            | 00395         |
| 11133 |   7707 | Really Cool Products| 66647         |
|  7715 |   7710 | Suction Cups        | 08396         |
+-------+--------+---------------------+---------------+

アイテム

+------------+------------+-----------+----------+---------+
| child_key  | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| 24171      |      10.50 |     20.10 |      200 |     100 |
| 35685      |      10.50 |     20.10 |      200 |     100 |
| 76505      |      10.50 |     20.10 |      200 |     100 |
| 04365      |      10.50 |     20.10 |      200 |     100 |
| 01975      |      10.50 |     20.10 |      200 |     100 |
| 12150      |      10.50 |     20.10 |      200 |     100 |
| 40060      |      10.50 |     20.10 |      200 |     100 |
| 08396      |      10.50 |     20.10 |      200 |     100 |
+------------+------------+-----------+----------+---------+

数字は実際にはこれよりもはるかに複雑です(私は実際には過去15年間の月または年の変動量を集計しているため、集計結果の20列が必要になる場合があります)。

編集: @Gordon結果セットを取得するには、いくつかの方法があると思います。理想的には、RecursiveIteratorのものを使用して、すべてのビジネスロジック(リーフノードなど)はすでに実行されているため、結果は次のようになります(隣接リストの深さは任意であることに注意してください)。

+------------+------------+-----------+----------+---------+
| Name       | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| Monitors   |      36.00 |     60.40 |      800 |     400 | (category)
| --24"      |      22.00 |     40.20 |      400 |     200 | (category)
| ---04365   |      10.50 |     20.10 |      200 |     100 | (item)
| ---04366   |      11.50 |     20.10 |      200 |     100 | (item)
| --22"      |      1.50  |     10.10 |      200 |     100 | (category)
| ---04365   |      1.50  |     10.10 |      200 |     100 | (item)
| -01234     |      12.50 |     10.10 |      200 |     100 | (item)
+------------+------------+-----------+----------+---------+

:編集終了

私はRecursiveIteratorIteratorAggregateを理解しようとしてきましたが、これらのクラスに頭を悩ませるほど一般的な実例を見つけるのに苦労しています。

誰かが私に有利なスタートを切ることができますか?

編集:

ここでは、非常に詳細なソリューションは必要ありません。階層データを集約するためのクリーンでスケーラブルなソリューションを考え出すために、Iterator、RecursiveIterator、RecursiveIteratorIteratorなどをどこで利用できるかは不明です。

:編集終了

4

1 に答える 1

0

あなたが本当に欲しいものは何ですか:より良くてより短いphpコードまたはより最適化されたそして速いリクエスト?後者の場合は、ツリーに対する一般的な操作(すべての子孫の選択、ブランチの移動など)を単一のSQL要求で実行できるため、ネストされたセットを実際に調べる必要があります。

実装の具体例については、「Zend_Db_NestedSet」プロポーザルをグーグルで試してください。「マルチルート」ツリーをサポートしているため、理論的には1つのテーブルを使用して、さまざまなデータコレクションの一般的な階層関係を維持できます。

于 2010-05-06T19:16:17.640 に答える