我有一张桌子,可以非常频繁地存储我的用户的位置。我想经常查询这个表并返回我还没读过的最新行。
这样做的最佳做法是什么。我的想法是:
boolean
读取标志,查询所有结果为false的结果,返回它们然后将它们全部更新。这可能会减少额外的写入速度最终会有多个users
和readers
位置,所以这不会有所扩展
答案 0 :(得分:1)
如果您拥有的是存储行内容的SQL数据库。我建议选项2。
我可能会做的是保留一个时间戳而不是ID,以及一个索引(MSSQL上的聚簇索引或类似的构造,以便新行按时间进行物理排序)。然后只是查询比那更新的东西。
确实会失去他们的位置"问题。如果客户端必须读取已发布的每一行,那么我要么在处理后删除它们,要么在数据库中有一个标志来表明它们已被处理。如果客户端只需要重新开始读取当前数据,那么我会像上面那样做,但是用最新的现有行初始化时间。
如果你必须处理每条记录,不限于数据库,你真正谈论的是一个消息队列。如果您需要能够在处理之后访问单个数据点,那么消息处理的一个步骤可能是插入数据库以供以后查询(除了这对数据执行的任何操作外)读取)。
根据评论编辑:
如果接收时无需处理,但您只想定期更新数据,那么您可以使用保留上次接收时间或ID而不删除数据的解决方案。在这种情况下,我建议不要在重新启动/重新连接时保留最后一个已知的id / timestamp,因为你可能最终无意中加载了一堆数据。只需在重新启动时重置最大值。
另一方面,当我做这样的事情时,我在使用MQTT传输数据方面取得了很大的成功,而对于" live"更新。这是一个发布/订阅消息传递协议。您可以在后端订阅流程并将数据转发到数据库,而想要数据的东西可以直接订阅数据流以进行实时更新。还有一个功能可以保留最后发布的消息并将其转发给新订阅者,这样您就不会完全开空。