直销数据库架构如何设计?采用oracle数据库!

原来一直都是做olap的架构设计,现在接触oltp,做直销数据库架构设计,求各位大神指指招!需求分析:
  1. 一个用户只能拥有2个下级,如果此用户还有推荐下级用户,则放到子下级下面
  2. 每注册一个用户,就要为该用户的上6级用户分红,当然分红是有条件的,如果注册用户处于绩效少的一侧才分红,否则不分,离得最近的3个上级,每个上级分10%,离得远的3个上级,每个上级分5%。

如图:新注册用户J,上级用户是I,当前I只有J一个下级用户,就认为J是I的大区(绩效大),所以I不能分J的分红,然后再往上找上级用户G,注册用户J处于G的小区(绩效小的一侧),所以G要分得I的10%,也就是5块钱。然后依次类推,往上继续判断,总共6个上级用户分红才结束。

1.png


因为用户量比较大,现在需要设计各个表结构,还需要更快的算出每个用户的绩效(每注册一个用户就需要很快的算出提成),当然还要考虑表的IO,是否需要分表。原来做olap没有考虑这么多,求各位支支招
目前确定要建立一个关系表,存储每个用户之间的位置关系,比如在哪一层,位于左侧还是右侧,用户D相对于用户A的位置,大致结构如下
用户id     下级用户id    层次   区域
A             D             2         0
A             J              4         1
B             E              1         1
C             H               2        1
层次就表示当前D在A的第几层,区域就表示D对于A来说,在左边还是在右边,左边则为0。但还有很多不完善的地方,比如该怎么维护关系表,还有哪些设计需要注意的地方,关系表维护好之后,还有注册用户的分红怎么算。要是有直销数据库系统的案例参考就更好了。
参与12

8同行回答

royalwzyroyalwzy技术经理海通证券股份有限公司
1.这个需求点最大难点:        1.大区/小区会随时发生变化;        2.当有新用户进来会发生级联的数据更新;        3.树的结构可能会非常倾斜,树的层级会比较高;2.优点:        1.并...显示全部
1.这个需求点最大难点:
        1.大区/小区会随时发生变化;
        2.当有新用户进来会发生级联的数据更新;
        3.树的结构可能会非常倾斜,树的层级会比较高;

2.优点:
        1.并发访问低;
        2.数据量应该不大;

3.可以考虑主要设计以下字段,一定不要保存下级用户,让用户ID作为主键;
        用户ID 上级用户 兄弟用户 分值 总分值收起
证券 · 2015-08-04
浏览1703
xtsqianlixtsqianli数据库架构师德家
回复 8# royalwzy    恩,因为我想的这只是作为一个关系表,只保存各个用户之间的关系。另外绩效提成在单独拿一个表出来计算。显示全部
回复 8# royalwzy


   恩,因为我想的这只是作为一个关系表,只保存各个用户之间的关系。另外绩效提成在单独拿一个表出来计算。收起
互联网服务 · 2015-08-05
浏览1720
royalwzyroyalwzy技术经理海通证券股份有限公司
回复 7# xtsqianli    这个是一个通用的数据结构,不仅仅是新注册的人有总分值(可以为0),所有人都有;你再慢慢体会下,想想具体的操作就会明白了;显示全部
回复 7# xtsqianli


   这个是一个通用的数据结构,不仅仅是新注册的人有总分值(可以为0),所有人都有;你再慢慢体会下,想想具体的操作就会明白了;收起
证券 · 2015-08-05
浏览1661
xtsqianlixtsqianli数据库架构师德家
回复 6# royalwzy    这个分值和总分值,分值表示当前新注册用户的绩效,总分值表示当前新注册用户及其所有下级的绩效??总分值不应该这么表示吧。新注册的用户还没有下级呀显示全部
回复 6# royalwzy


   这个分值和总分值,分值表示当前新注册用户的绩效,总分值表示当前新注册用户及其所有下级的绩效??总分值不应该这么表示吧。新注册的用户还没有下级呀收起
互联网服务 · 2015-08-04
浏览1689
royalwzyroyalwzy技术经理海通证券股份有限公司
回复 5# xtsqianli 1.其实是有隐含的层级在里面的,就像你刚刚看到的,可以通过节点访问上层节点的;2.分值和总分值我的意思是代表当前用户的绩效和这个用户下面所有人的绩效总和;显示全部
回复 5# xtsqianli


1.其实是有隐含的层级在里面的,就像你刚刚看到的,可以通过节点访问上层节点的;

2.分值和总分值我的意思是代表当前用户的绩效和这个用户下面所有人的绩效总和;收起
证券 · 2015-08-04
浏览1782
xtsqianlixtsqianli数据库架构师德家
回复 4# royalwzy    哥们,按照你给的这个关系表设计的话,没有存用户的层级关系,每注册一个用户的时候,就需要调用一次递归查询上6级用户  你给的分值 总分值 是什么意思呀??这个2个字段没明白。   感觉有点像注册表的数据了。你看下我这个注册...显示全部
回复 4# royalwzy


   哥们,按照你给的这个关系表设计的话,没有存用户的层级关系,每注册一个用户的时候,就需要调用一次递归查询上6级用户
  你给的
分值 总分值 是什么意思呀??这个2个字段没明白。


   感觉有点像注册表的数据了。你看下我这个注册表的测试数据
    userid就是当前用户,topuid就是上级用户,leftuid就是左下级用户,rightuid就是右下级用户,tjuid就是推荐用户

12.png

收起
互联网服务 · 2015-08-04
浏览1638
royalwzyroyalwzy技术经理海通证券股份有限公司
回复 3# xtsqianli 1.先做个计算哈:按照你设想的一个用户量为100W的话,对于一个平衡二叉树的话就是会有19层;2.我的提议中,保存了兄弟用户的ID,目的就是你可以动态的快速计算出来此节点是大区还是小区;3.如果按照你的设计的话,用户关系表是会越来越大,但是如果你按照我讲...显示全部
回复 3# xtsqianli

1.先做个计算哈:按照你设想的一个用户量为100W的话,对于一个平衡二叉树的话就是会有19层;

2.我的提议中,保存了兄弟用户的ID,目的就是你可以动态的快速计算出来此节点是大区还是小区;


3.如果按照你的设计的话,用户关系表是会越来越大,但是如果你按照我讲的用户ID作为主键的话,关系表和用户表是一样大小的;


4.针对你担心的第三点:看下上面计算的值,你需要计算出来6个上级用户的绩效,理想最大需要通过主键访问19次,况且Oracle提供了connect by语法来完成层级关系的处理;


继续沟通...收起
证券 · 2015-08-04
浏览1710
xtsqianlixtsqianli数据库架构师德家
回复 2# royalwzy    谢谢哥们回复!    大小区确实会发生变化,而且随时都有可能,所以在计算新注册用户提成的时候,每次都要算一下当前注册用户处于上级用户的大区还是小区。    当有新用户注册的时候,不但要更新注册表,还要更新用户关系表,用户有...显示全部
回复 2# royalwzy


   
谢谢哥们回复!
    大小区确实会发生变化,而且随时都有可能,所以在计算新注册用户提成的时候,每次都要算一下当前注册用户处于上级用户的大区还是小区。
    当有新用户注册的时候,不但要更新注册表,还要更新用户关系表,用户有100W的话,后面更新插入的记录会越来越多,因为我这里需要快速算出每个新注册用户的提成,所以关系表的数据量比注册表的数据量要多很多。
    按照哥们你说的存上级用户的情况,新注册用户的时候,这个用户也是要把所有的上级用户关系要列出来,不然在后面算绩效的时候,不是很快。收起
互联网服务 · 2015-08-04
浏览1707

提问者

xtsqianli
数据库架构师德家

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2015-08-04
  • 关注会员:1 人
  • 问题浏览:6521
  • 最近回答:2015-08-05
  • X社区推广