## DrissionPage 请注意,我使用的浏览器框架是 DrissionPage,框架的查找语法为: ```python ele2 = ele1.ele('xpath://div') # 获取 ele1 的第二层父元素 ele2 = ele1.parent(2) # 获取 ele1 父元素中 id 为 id1 的元素 ele2 = ele1.parent('#id1') # 获取 ele1 后面第一个兄弟元素 ele2 = ele1.next() # 获取 ele1 后面第 3 个兄弟元素 ele2 = ele1.next(3) # 获取 ele1 前面第一个兄弟元素 ele2 = ele1.prev() # 获取 ele1 前面第 3 个兄弟元素 ele2 = ele1.prev(3) # 获取 ele1 前面第 3 个元素 ele2 = ele1.before(3) # 获取 ele1 前面第 3 个 div 元素 ele2 = ele1.before('tag:div', 3) # 获取 ele1 前面第一个文本节点的文本 txt = ele1.before('xpath:text()', 1) ``` ```html
程序员马工
1
 · 刚刚
1
``` 有如上元素,现在已经根据 ele_msg_red_pot = ele_list_dlg.ele('xpath://div[@class="hcPUqxqn"]') 找到了 未读消息1,情帮我根据相对定位 如 ele_msg_red_pot.prev().child(1) 或xpath 语法 来找到名字,头像,消息。最后的消息格式为: {"name":"程序员马工", "avator":"urlxxx", "new_msg":2, "time":"刚刚"} ## 构思 假设要做一个直播信息统计的工具,产生的数据如下: - 每个主播开启一个独立的直播间,可能有上万个主播,也就是数万个直播间。 - 每个主播可能每天开几场直播,或者每个月开几十场直播 - 每个直播间有几百或上百万用户观看 - 每个观众可能会发布弹幕或礼物信息,一场直播可能有几千到几百万条弹幕或礼物数据 - 每条弹幕或礼物数据包含发表弹幕的用户头像、信息、主页链接、昵称等等。 - 所有的内容都是 json 格式的数据,少则 几k多则 64k 的数据。 - 每个观众和主播都可以用用户 id 来表示 可能需要统计的信息如下: - 每个主播、每场直播开播时长,频率,收到的礼物总数 - 每个主播每天的直播时长,直播间数,观众数,平均每小时的观众数,平均每小时的弹幕数 - 记录直播间总弹幕、礼物数 - 分析每一条弹幕频率,或分析观众在直播间的建议和需求 根据以上需求,如果设计一个合理的软件数据架构,在 PostgreSQL 、本地 SQLite 、对象存储 等方案中,你会怎么设计? 但是如果只创建一个弹幕表,或者只有一个直播间表,那么数据量会非常庞大,如果每天有几千个主播开直播,那么一个弹幕表和礼物表显然会非常庞大,如果每天有上万场直播,那么一张表的数据量会达到几亿甚至几十亿。 一个可能的构思如下: - 主播表 anchors ,记录每个主播的基本信息,包括头像、昵称、简介等 - 直播间表 live_rooms ,记录每场直播的开播时间、直播间 id、主播 id 等 - 直播场次表 live_sessions ,记录每场直播的开播时间、结束时间,直播间 id、主播 id 等 - 主播直播间弹幕表 danmus ,根据 live_sessions id 进行表分区,例如 CREATE TABLE danmus_{live_sessions_id} PARTITION OF danmus - 主播直播间礼物表 gifts ,根据 live_sessions id 进行表分区,例如 CREATE TABLE gifts_{live_sessions_id} PARTITION OF gifts 上述是否合理,给出最佳合理的表结构,以及如何设计数据存储方案。 ## 数据库表设计 anchors (主播表) anchor_id (主键) nickname avatar description ... (其他主播相关信息) live_rooms (直播间表) room_id (主键) anchor_id (外键,关联anchors表) room_name ... (其他直播间相关信息) live_sessions (直播场次表) session_id (主键) room_id (外键,关联live_rooms表) start_time end_time viewer_count ... (其他直播场次相关信息) danmus (弹幕表) —— 使用表分区 danmu_id (主键) session_id (外键,关联live_sessions表) content user_id (发送弹幕的用户ID) timestamp ... (其他弹幕相关信息) 可以根据session_id进行表分区,以提高查询效率。 gifts (礼物表) —— 使用表分区 gift_id (主键) session_id (外键,关联live_sessions表) user_id (发送礼物的用户ID) gift_name timestamp ... (其他礼物相关信息) 同样可以根据session_id进行表分区。 users (用户表) —— 记录所有观众和主播的信息 user_id (主键) nickname avatar ... (其他用户相关信息) 总结 使用PostgreSQL作为主要的数据库解决方案,利用其强大的功能和表分区技术来管理大规模数据。 根据直播场次(session_id)对弹幕和礼物表进行分区,以提高查询效率和数据管理。 避免在单个表中存储过多的数据,通过合理的表设计和分区策略来优化性能。 对于非结构化数据(如用户头像等),可以考虑使用对象存储进行保存,并在数据库中保存相应的链接或标识符。