【问题标题】:Storing chat logs in relational database在关系数据库中存储聊天日志
【发布时间】:2013-01-04 01:09:33
【问题描述】:

我正在编写一个聊天机器人,它使用过去的对话来生成它的响应。目前我使用文本文件来存储所有数据,但我想改用数据库,以便机器人的多个实例可以同时使用它。

我应该如何构建这个数据库?

我的第一个想法是保留一个像create table Sessions (startTime INT,ip INT, botVersion REAL, length INT, tableName TEXT) 这样的主表。然后对于每个对话,我 create table <generated name>(timestamp INT, message TEXT) 包含该对话期间发送或接收的所有消息。对话结束后,我将新表的名称插入Sessions(tableName)。以这种方式以编程方式创建表可以吗?我之所以这么问,是因为大多数 SQL 教程似乎都建议在程序初始化时创建表。

另一种方法是使用一个巨大的create table Messages(id INT, message TEXT) 表来存储发送或接收的每条消息。当对话结束时,我可以向Sessions 添加一个新条目,其中包括该对话期间使用的id,以便我可以查找在特定对话期间发送的所有消息。我想这样做的一个好处是我不需要数百或数千张桌子。

我计划使用 SQLite,尽管它的并发性很低,因为机器人的每个实例在生成响应之前可能会进行数千次读取(这将导致一次写入)。不过,如果另一个关系数据库更适合此任务,请发表评论。

注意:关于在数据库中存储聊天日志还有其他问题,但我特别在寻找它应该如何构建以及对上述想法的反馈。

【问题讨论】:

  • 我非常怀疑每次对话一张桌子是正确的解决方案。
  • 我怀疑将时间戳存储在 int 中是否是正确的解决方案。 btw:sourceforge.net/projects/wakkerbot wakkerbot 将其输入和输出(当前为推文)存储在 postgres 数据库中。输入包括 200 万条“博客”反应,输出大约 2000 条帖子和推文。您可以在 SF 上找到(旧版本的)数据模型。
  • @wildplasser 为什么时间戳有问题?我正计划使用 unix 时间戳(从纪元开始的秒数)。 IIRC SQLite INT 是一个 int64,所以它不应该溢出。
  • 因为在您的查询中您想使用纯文本人类可读的常量:WHERE submission_date < '2011-10-20'
  • @wildplasser SQLite 对时间没有非常复杂的理解,所以日期要么是字符串(ISO 格式,UTC 格式可能是最好的)要么是数字(从纪元偏移,如 Unix 时间戳)。如果用户不直接编写 SQL——让我们面对现实吧,大多数人不会——那么两者都可以。当然,从语义上讲,它们可以捕捉到稍微不同的东西,但这在这里重要吗?请注意,理解“人类”时间是困难的,非常可怕;有关于这个主题的完整的专业图书馆......

标签: python sql database sqlite database-design


【解决方案1】:

不要为每个对话使用不同的表格。而是将“对话”列添加到您的单个表中。

【讨论】:

  • 如果我这样做,conversation 列将不得不存储对话中的每条消息,对吗?我更喜欢将每条消息分开
  • @Navin:当然——那叫normalisation(Ps:抱歉是维基)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2018-02-01
  • 2014-12-03
  • 2015-07-26
  • 2013-03-04
  • 2019-07-09
  • 2017-11-02
相关资源
最近更新 更多