以绩效为导向的联盟系统设计

时间:2012-05-08 02:13:52

标签: php architecture neo4j graph-databases

好吧,我正在设计一个使用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多人。这很慢,我必须每个月在Joe的仪表板上展示这个。 :(

2 个答案:

答案 0 :(得分:2)

使用Neo4j和Cypher,您可以按照图表要点执行某些操作:http://tinyurl.com/7vryzwz

基本上,Cypher(http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html)查询是

START referrer=node(1)
MATCH path=referrer-[:referred*1..]->refferee
RETURN referrer,refferee, length(path) as generation
ORDER BY length(path) asc

这有帮助吗?

/彼得

答案 1 :(得分:0)

这不太难。

每当新会员注册(或达到他们被视为会员的级别)时,将“1”添加到会员的Affiliate计数,该计数应从零开始。在这样做的同时,一直向上移动到附属机构链......

鲍勃带来弗雷德,他带来了安妮。

当Anne注册时,Fred收到+1,而Bob收到+1(或者,如果你愿意,可以收到少于+1,因为Anne是2级)。

这是自下而上的方法,你的联盟网络是一堆树(森林),所以它更好地工作。你从树叶到树枝到树干。这也意味着您可以提供不断更新的人员归属成功统计数据。