さて、私は PHP と Neo4J を使用して小規模なアフィリエイト システムを設計しており、Neo4J とグラフ データベースのしくみについてもう少し勉強しています。私の元のアフィリエイト システムは MySQL にあり、設計とストレージを Neo4J に移行するだけでパフォーマンスが向上するのはばかげています。
ただし、おそらく非常に間違っている機能がいくつかあり、経験豊富な開発者の助けを借りて、それがどれほど改善されるかを楽しみにしています. たとえば、システムは毎月、各アフィリエイトに支払う金額を計算する必要があります。これは、ユーザー ネットワーク全体を検索することを強制するいくつかの規則に従います。
たとえば、Joe の月給を計算するには、システムは次のことを行う必要があります。
Find Node Joe
function Calculate:
Calculate amount of people referred (all tiers)
Calculate the number of referral tiers (all tiers)
Calculate points
Store information inside object properties
- tiers: Joe は Mary を参照し、Mary は次に Bob を参照します。Mary は Tier 1、Bob は Joe の下の Tier 2 です。
- すべての階層: ジョー、メアリー、ボブに基づいて数を計算します
そのため、Calculate 関数は再帰関数のように見えます。Joe から紹介されたユーザーごとに、Joe に戻って番号を取得するまで、彼とそのすべての子供に対して Calculate 関数を実行する必要があります。
これは地獄のように遅いです。RabbitMQ または ZMQ を使用して、Joe の計算の「子プロセス」ごとにキューを作成することを考えました。pcntl のフォークを使用することも考えました。グラフ ネットワーク内でこの再帰プロセスを改善するにはどうすればよいですか? ツリー全体を通過する最良の方法は何ですか? 待ち行列?プロセスフォーク?
もう一つの例:
Calculate(Joe)
Joe referred Mary, Bob, Peter
Calculate(Mary)
Mary referred Sara, Megan
Calculate(Sara)
Calculate(Megan)
Calculate(Bob)
Bob referred Billy, Michael
Calculate(Billy)
Calculate(Michael)
Calculate(Peter)
Peter referred Charles, Max
Calculate(Charles)
Calculate(Max)
これを 500 人の紹介者に掛けると、それぞれの紹介者は 500 人を超えることができます。めちゃくちゃ遅いので、毎月、Joe のダッシュボードにこれを表示する必要があります。:(