## 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
```
有如上元素,现在已经根据 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)对弹幕和礼物表进行分区,以提高查询效率和数据管理。
避免在单个表中存储过多的数据,通过合理的表设计和分区策略来优化性能。
对于非结构化数据(如用户头像等),可以考虑使用对象存储进行保存,并在数据库中保存相应的链接或标识符。