【发布时间】: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