Python 在关系数据库中存储聊天日志

Python 在关系数据库中存储聊天日志,python,sql,database,sqlite,database-design,Python,Sql,Database,Sqlite,Database Design,我正在编写一个聊天机器人,它使用过去的对话来生成响应。目前,我使用文本文件来存储所有数据,但我希望使用数据库,以便bot的多个实例可以同时使用它 我应该如何构造这个数据库 我的第一个想法是保留一个主表,如创建表会话(startTime INT、ip INT、botVersion REAL、length INT、tableName TEXT)。然后,对于每个会话,我创建一个表(timestamp INT,message TEXT),其中包含该会话期间发送或接收的所有消息。对话结束后,我将新表的名称

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

我应该如何构造这个数据库

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

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

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


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

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

不要为每个对话使用不同的表。相反,在单个表中添加一个“conversation”列。

我非常怀疑每个对话一个表是否是正确的解决方案。我怀疑在int中存储时间戳是否是正确的解决方案。顺便说一句:wakkerbot将其输入和输出(当前为tweets)存储在postgres DB中。输入包括200万条“博客”反应,输出约2千条帖子和推文。您可以在SF上找到数据模型的(旧版本)。@wildplasser为什么时间戳是个问题?我计划使用unix时间戳(从epoch算起的秒数)。IIRC SQLite INT是一个int64,因此不应溢出。因为在查询中,您希望使用纯文本的人类可读常量:
其中提交日期<'2011-10-20'
@wildplasser SQLite对时间没有非常复杂的理解,所以日期要么是字符串(ISO格式,UTC格式,可能最好)要么是数字(与epoch的偏移量,如Unix时间戳)。如果用户不直接编写SQL——我们承认,大多数用户都不这样做——那么两者都可以工作。当然,从语义上来说,他们可以捕获稍有不同的东西,但这在这里重要吗?请注意,理解“人类”时间是艰难的,可怕的是;在这个主题上有整个专家库……我高度怀疑每个对话都有一个表是正确的解决方案。我怀疑在int中存储时间戳是否是正确的解决方案。顺便说一句:wakkerbot在postgres DB中存储其输入和输出(目前为tweets)。输入由2M“blog”组成反应,输出大约2K条帖子和tweet。您可以在SF上找到数据模型的(旧版本)。@wildplasser为什么时间戳是个问题?我正计划使用unix时间戳(从纪元算起的秒数).IIRC SQLite INT是一个int64,因此不应溢出。因为在查询中,您希望使用纯文本人类可读常量:
其中提交日期<'2011-10-20'
@wildplasser SQLite对时间的理解不太透彻,所以日期要么是字符串(ISO格式,UTC格式,可能最好)要么是数字(与epoch的偏移量,如Unix时间戳)。如果用户不直接编写SQL——我们承认,大多数用户都不这样做——那么两者都可以工作。当然,从语义上来说,他们可以捕获稍有不同的东西,但这在这里重要吗?请注意,理解“人类”时间是艰难的,可怕的是;在这个主题上有完整的专家库……如果我这样做,
对话
专栏将不得不存储对话中的每条消息,对吗?我更喜欢保留每条消息seprate@Navin:当然-这就是所谓的(Ps:对不起,这是维基).如果我这样做,
对话
列将必须存储对话中的每条消息,对吗?我宁愿保留每条消息seprate@Navin:当然,这就是所谓的(Ps:对不起,这是维基)。