好吧,我正在设计一个使用 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
- 层级:乔指的是玛丽,而玛丽又指的是鲍勃。玛丽是第 1 层,鲍勃是第 2 层,在乔之下。
- 所有层级:根据 Joe、Mary 和 Bob 计算数量
因此,Calculate 函数看起来像一个递归函数。对于 Joe 推荐的 Foreach 用户,我必须对他和他的任何孩子运行计算功能,直到我回到 Joe 并得到我的数字。
这慢得要命。我考虑过使用 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 人。它慢得要命,我每个月都必须在乔的仪表板上显示这个。:(