问一个数据库对业务数据存储的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gitrebase
V2EX    数据库

问一个数据库对业务数据存储的问题

  •  1
     
  •   gitrebase 2023-10-31 08:57:56 +08:00 1859 次点击
    这是一个创建于 715 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如“登录数据”的存储应该怎么设计

    一开始系统可能不存储“登录数据”,但是没过多久产品经理要分析“单位时间内用户登录数”,那此时应该对每次用户登录请求进行记录,根据数据库是不是为业务所用分为两种方案:1. 在业务数据库中建 login_time_log 表,只做 apped 操作; 2. 在数据分析建表,与业务数据隔离

    但之后产品经理都提出了需求,对“三日内未登录过的用户进行消息推送”,那此时“用户登录时间”的数据又算是业务数据了,如果采用上述方案一,那么每次都要 SELECT * FROM login_time_log ORDER BY login_time DESC LIMIT 1,性能会不会比较差;如果采用上述方案二,那么是不是要在业务表里加一个 last_login_time 的字段,这样的话就需要额外维护,而且在一定程度上也算“数据冗余”

    想向各位经验丰富见多识广的老哥们取取经

    13 条回复    2023-10-31 10:53:31 +08:00
    caihp
        1
    caihp  
       2023-10-31 09:08:30 +08:00
    在数据分析这边建表存储每一个登录操作; 然后三日内那个的话我觉得可以先查出来在这三天登录过的用户 id ,然后给所有用户中不在这些 id 里面的用户进行消息推送
    ding2dong
        2
    ding2dong  
       2023-10-31 09:10:59 +08:00
    分开啊,数据分析需求是多变的,不可能频繁动业务表结构的
    gitrebase
        3
    gitrebase  
    OP
       2023-10-31 09:17:09 +08:00
    @caihp 如果登录数据存储在数据分析那边的话,“三天登录过的用户 id”不就要在数据分析那边查了吗
    xianbing278
        4
    xianbing278  
       2023-10-31 09:44:19 +08:00
    感觉你们产品经理的需求是要对用户数据指标有要求,这个应该算是基础数据吧,从基础数据出发去考虑会不会好一点
    julyclyde
        5
    julyclyde  
       2023-10-31 09:56:51 +08:00   1
    如果仅仅是单位时间内的登录“数量”但无所谓“谁”
    那其实你只需要用 redis 维护一个计数器就行了。incr 操作应该是原子的,不会因为交错执行而导致少统计
    过了这个时间片之后再用计划任务去存盘也可以,比你那个附加数据表方案更优
    是一个强内存、弱 IO 的做法

    但是后续你又要“谁”,那就只好记在数据库里了。
    不过倒不一定登录时间作为用户的附属属性;也可以用户名作为登录日志的附属啊。也就是 @caihp 推荐的这种做法

    问题是就怕产品经理再改
    建议跟产品经理仔细谈谈,看有什么远期规划,直接一步到位算了
    gejigeji
        6
    gejigeji  
       2023-10-31 09:56:52 +08:00
    把业务数据同步到大数据平台
    piecezzz
        7
    piecezzz  
       2023-10-31 10:00:01 +08:00
    2 , 闲时把业务用户数据 copy 到数据分析,用户每次登录的数据发消息队列双写到业务库与数据分析库。你在业务库爱怎么搞怎么搞
    piecezzz
        8
    piecezzz  
       2023-10-31 10:00:48 +08:00
    说错了,是数据分析库
    midsolo
        9
    midsolo  
       2023-10-31 10:01:10 +08:00   1
    先按照规则圈定人员名单,然后对名单内的用户进行消息推送。

    在公司中这类需求都会用 Kafka + Flink 体系去做,采集用户登录日志、走各种数据分层模型、存储人员名单、创建消息推送任务、配置消息推送模板、填充模板、消息推送审批、触发消息推送任务......
    lscho
        10
    lscho  
       2023-10-31 10:15:40 +08:00
    login_time_log 表解决分析“单位时间内用户登录数”

    单独建一个用户-最后登录时间表解决对“三日内未登录过的用户进行消息推送”

    别想那么复杂的东西
    R4rvZ6agNVWr56V0
        11
    R4rvZ6agNVWr56V0  
       2023-10-31 10:26:25 +08:00
    看业务扩张的规模,如果预计 1 年内不会有很大的增长,那么简单粗暴的弄。例如:写个独立的微服务扫描从库的这张表,做数据分析计算,随便你怎么加字段了,性能不会被影响很大的。
    或者表重新写入 duckdb 这类的嵌入式数据库,分析逻辑自己写就行了。跟不需要引入第三方 db 服务,运维能喘口气了。
    pkoukk
        12
    pkoukk  
       2023-10-31 10:26:42 +08:00
    看你公司规模和业务量级,没多大量级的东西根本不需要考虑这些事情,跟着需求走就完了
    大公司的路数就是 9#说的,小业务根本没预算上这一套
    bugmakerxs
        13
    bugmakerxs  
       2023-10-31 10:53:31 +08:00
    大公司一般都是建数仓,然后应用往数仓推数据。数仓对原始数据做聚合查询。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3114 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:32 PVG 08:32 LAX 17:32 JFK 20:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86