• 桂城老托尼
    2019-12-27
    感谢争哥分享。
    个人觉得积分系统只有流水记录不太够,设想下消费积分场景,要完成扣积分的动作,没有积分余额表容易造成多扣,特别是针对羊毛党。当然上层系统,比如活动系统也可以做好幂等。
    尝试回答下课后讨论
    1. 保留上层应用id和channel完全符合设计原理,冗余业务信息方便日后做数据统计,沉淀数据资产反推营销策略迭代; 一次消费或赚取积分行为可能存在多次调用情况,方便幂等,不至于多次记账;方便业务系统查询某次赚取或消费的积分明细;暂时想到这么多。
    2. 尽量不要返回void或boolean,有些业务需要反向关键积分流水id做单笔流水查询。
    其实这两个讨论都类似于现实生活,去便利店买东西会给你小票,支付宝扫码付款会返回交易流水。都是为了方便真是场景解决“纠纷”(查询)用的。
    展开
     5
     35
  • Jxin
    2019-12-27
    1.不符合一对上下游系统的设计要求,但适合当下业务场景的需求。 下游积分核心系统设计上不该持有事件和渠道字段,因为它不该去关心上游业务,事件或渠道与对应积分明细的关联应该由上游系统来维护,或则在上游系统和积分系统之间再加一层积分系统的业务层,用于维护这层关系(关于易复用性的中台思想)。当下的业务场景,积分的管理系统是有必要维护一份 事件渠道的值对象的。因为带有这个值对象,积分系统管理员才能不需要再多个系统中寻找积分增减关系,进而可以独立满足管理积分这件事的整个业务域。(事件和渠道只能作为值对象冗余在积分系统)。

    2.不符合单一职责的限制,但满足当前业务场景的诉求。该接口做了增减积分和返回积分id两件事,且语义上并没有返回积分id的相关字眼,所以方法名定义也不明确。但是上游系统在变更积分后,需要获取积分id以作为上游系统变更事件与积分记录的关联key。而这个key只有在当前变更操作获得,所以就只能写这种语义不明且违反单一职责的方法。(让我来设计,我会把积分id的生成作为积分系统的一个外放接口,上游业务调用该接口获取id,记录关联关系,然后走mq推积分系统实现最终扣减。这样就可以规避上述这种无奈的场景)。
    展开
     3
     10
  • 李朝辉
    2019-12-27
    课堂讨论1:
    业务驱动的系统还是应该从业务的角度出发去做设计,这两个字段在积分明细查询中是不可或缺的,所以我认为是合理的。既然是不可或缺的,如果不记录在这张表中,就要记录在其他表中,或者查询不便,或者破坏内聚。
    2.根据个人经验,insert操作的都是返回记录id,原因的个人观点是为调用方提供便利。还请老师解答

    作者回复: 说的挺对的

    
     9
  • 杨杰
    2019-12-27
    个人感觉:VO、BO、Entity 通过组合关系来复用这个类的代码不是特别好,尤其是VO。因为用组合的方式会增加返回数据的层次,这对前端来说是不是不不太友好?

    作者回复: 是的 主要是对象转json的格式问题

    
     6
  • 辣么大
    2019-12-27
    反馈一个文章朗读的小问题:音频3:00左右 facade设计模式 应该读做/fə'sɑ:d/ ,冯老师读的不是很准确。 ”吹毛求疵“,希望专栏做的更专业。

    编辑回复: 应该吹毛求疵,我们fix去

     3
     6
  • 辣么大
    2019-12-27
    针对争哥的第一个问题,从设计角度来说不应该记录渠道和事件。从业务来说,必须记录交易的渠道和事件。基于这种妥协可以设计一张表。那是否也可以设计两张表?

    积分交易表和明细表:
    1、credit_transaction
    trans_id
    user_id
    channel_id
    event_id
    create_time
    2、积分明细表credit_detail,只记录积分加减
    trans_id
    credit (积分加减)
    create_time
    expire_time
    展开
     21
     5
  • 黄林晴
    2019-12-27
    打卡✔
    难道是我膨胀了,实战的内容没有理论看的起劲

    作者回复: 期望太高了 也不可能篇篇让你高潮

     2
     5
  • aya
    2019-12-27
    1增加上层相关字段有利于出现问题时的排查工作,并且ods等系统在抽数据时也可以提供完整数据。
    2不违背单一指责原则,赚取积分和消费积分的业务逻辑必然会伴随积分余额查询,业务上应属同一逻辑,拆分反而shi程序复杂。
    
     4
  • 杨陆伟
    2020-01-02
    VO、BO、Entity频繁的克隆、拷贝会不会引入性能问题,这点是怎么考虑的?谢谢

    作者回复: 虽然有性能损耗 但可以忽略 影响不大

    
     3
  • Jeff.Smile
    2019-12-27
    实际中没见过同时定义vo bo entity的
     1
     3
  • 下雨天
    2019-12-27
    说说第一个问题,系统设计跟数据库设计没必然联系,这样设计合理!
    数据库设计中有点像服务器请求设计
    1.数据库拆分过细,各表字段间关联变麻烦了,提高数据不一致性风险!
    2.数据库中表多意味着访问可能性变大,数据库的连接,建立都是需要时间和消耗性能的!
    
     3
  • 林
    2020-01-02
    为什么积分明细表没有user_id字段,如何查询用户的可用积分

    作者回复: 是个问题 我改下

    
     2
  • 斐波那契
    2019-12-31
    老师 beanutils会不会性能不好 毕竟大量用到了反射 有没有代码不那么繁琐性能也比较好的方法

    作者回复: 对于大部分业务系统来说 数据库是最耗时的 对象转化那点性能损失可以忽略

     2
     2
  • 兴
    2019-12-29
    第一次评论说的不对请指正

    第一个问题分两种情况:
    1. 如果是积分和营销业务分离的话,下层业务就不应该关注上层业务,积分系统只记录自己的流水,event_id和channel_id则应该由上层记录
    2. 如果是积分和业务系统放在一起的话(就像争哥推荐的那样),这种方案就符合当前业务情景。

    第二个问题:
    这种虽不符合单一职责,但如果每次插入后业务需要ID的做其他事情的话(或者以后也需要),这种方案的成本最小。
    展开
    
     2
  • 胖子
    2019-12-27
    我有一个疑问:接口设计、数据库设计和业务模型设计如何对应或过渡到MVC分层?

    作者回复: 接口 controller层
    数据库 repository
    业务 service

    
     2
  • 京京beaver
    2020-01-08
    第一个问题:合理。设计积分和金钱类的修改需要对账,不引入渠道id和事件id,无法与高层系统完成对账,是设计隐患,

    第二个问题:不违反。积分明细 ID是本次事务执行成功的回执,是后续对账,发起重试,处理幂等的依据。属于正常返回值。如果只返回void或者boolean没有任何业务含义,存在安全隐患。
    
     1
  • 传说中的成大大
    2020-01-02
    1. 是合理的 因为虽然数据库设计包含了上层的数据,但是绝大多数都是用来进行存数据库,存记录方便以后的维护和查询,比如像游戏开发 在数据库模块中总会设计到玩家角色id啊 名字啊等等 所以我觉得是合理的
    2. 并没有违背单一职责原则,因为修改或者查询的接口里面做的事情是很单一的,返回一个id,还便于去查询验证

    作者回复: 👍

    
     1
  • zk_207
    2019-12-30
    争哥,
    Vo和Bo应该分别放到Controller层、service层呢,还是统一放到domain层呢?

    作者回复: vo放到controller层 bo放到service层

    
     1
  • 陈迎春
    2019-12-29
    各位大佬好,我主要是做嵌入式软件开发的,平常设计模式用的不多,所以相对差一些,最近的两偏实战,我听了好几遍,但还是云里雾里,可否给出一些实际的代码?结合代码理解,可能会更好些

    作者回复: 估计你要自己下点功夫 毕竟讲的跟你现在做的有比较大距离

     1
     1
  • 知行合一
    2019-12-27
    争哥给出的是一个基础的积分系统案例,主要是从设计的角度来分析我们用到哪些原则和模式。真实场景的话肯定需要考虑高并发和大数据量的问题,那样的话可能需要单独出来积分账户表,存储积分余额,明细表需要分库分表。
    针对问题一,我觉的很有必要,毕竟业务需要查询积分的来源和做幂等性检验。
    问题二,这个主要看业务系统是否需要,大部分情况下我觉得是不需要的,业务系统增加积分或者消费积分就成了。需要的话也是为了对账,我哪个动作增加的哪笔积分,对账意义大于业务意义。
    
     1
我们在线,来聊聊吧