为具有回复和反应的电报消息设计 PostgreSQL 架构

问题描述 投票:0回答:1

我正在开发一个项目,从 Telegram 组中获取消息并将其存储在 PostgreSQL 数据库中以供以后分析,主要是为了解析波斯语/波斯语消息以微调大型语言模型。这些消息是

<class 'telethon.tl.patched.Message'>
的实例。我设计了一个初始架构,其中包括用户、通道(组)和消息的表。我的主要目标是有效存储消息、跟踪对特定消息的回复并捕获反应。

这是我迄今为止提出的架构:

CREATE TABLE Users (
    user_id BIGINT PRIMARY KEY,
    username VARCHAR(255)
);

CREATE TABLE Channels (
    channel_id BIGINT PRIMARY KEY,
    channel_name VARCHAR(255)
);

CREATE TABLE Messages (
    message_id INTEGER PRIMARY KEY,
    channel_id BIGINT,
    from_user_id BIGINT,
    date TIMESTAMP WITH TIME ZONE,
    edit_date TIMESTAMP WITH TIME ZONE,
    message_text TEXT,
    reply_to_message_id INTEGER,
    reactions JSONB,
    FOREIGN KEY (channel_id) REFERENCES Channels(channel_id),
    FOREIGN KEY (from_user_id) REFERENCES Users(user_id)
);

此模式旨在捕获消息的基本元素,包括它们与用户和渠道的关系以及任何相关的回复或反应。

问题和注意事项:

  1. 捕获回复:我想确保模式有效地捕获回复结构,即一条消息是否是对另一条消息的回复。我应该调整
    reply_to_message_id
    字段还是引入新的表格或机制?
  2. 反应:
    reactions
    字段是一种 JSONB 类型,旨在存储对消息的各种反应。考虑到潜在反应分析的需要,JSONB 是这里的最佳选择吗?
  3. 消息属性: 我应该考虑存储任何其他消息属性吗?我的目标是捕获足够的细节以进行全面分析,而不会使架构过于复杂。
  4. 语言注意事项: 鉴于这些消息主要是波斯语/波斯语,我在存储和稍后处理这些文本时是否应该考虑任何具体注意事项?

我正在寻求有关完善此架构的建议,以最适合我的项目的需求,特别是在可扩展性、效率以及执行复杂查询以进行分析的能力方面。

postgresql database-design schema telegram telethon
1个回答
0
投票
  1. 捕获回复:我过去也做过类似的事情,这是确保评论和回复具有相同模型并支持 n 嵌套的好方法。
  2. 反应:我会考虑将其分解到一个单独的表中,而不是使用 JSONB,这样它就有一个模式,您可以执行 1:* 左连接来获取信息,而不是仅仅存储一个数字,它可能是一个反应类型和一个 user_id 并聚合以获得计数(只是一个想法)
  3. 消息属性:取决于您真正可以获得什么信息,例如推文具有可选的地理信息。
  4. 语言注意事项:我没有太多像这样在 postgres 中存储文本的经验,但在插入之前你需要做一些清理工作,而且我不确定它将如何编码,我很想将其存储为bytea 并转换为应用程序代码。如果你打算进行任何文本分析,我不会在 postgres 中这样做

其他想法:

  • 您是否考虑过在 id 列中使用“serial”和“bigserial”?
  • message id 是唯一一个整数的 id,但我能想象的唯一一个需要是大整数的 id,除非你预计有超过 20 亿的用户
  • 您可以添加一些默认值,例如messages(date) 可以默认为 now()
  • 最初可能不是问题,但您可能需要考虑对消息表进行分区以保持大小易于管理
  • 我倾向于避免使用“varchar(255)”限制数据库层的文本字段,只需使用“文本”并在应用程序层添加限制
  • 考虑向消息添加一些“非空”验证
© www.soinside.com 2019 - 2024. All rights reserved.