2016-01-21 128 views
0

对于我的新应用程序 - 一种Android聊天 - 我想将我的消息本地存储在数据库中。 我最近看到别人怎么做。所以我在手机上看到了Whatsapp的SQLite数据库。在那里,他们将每个对话的所有聊天消息放在同一个表中。 重点是读/写新信息排序成千上万的消息,以显示只有与你的谈话伙伴似乎很多effER。Android聊天 - 数据库体系结构

我自己以为我想为每个聊天做一张桌子。所以我可以直接加载消息而不检查作者 - 因为表名将是我正在与之交谈的用户名。我认为这可能会更快 - 特别是如果你有很多消息。

我的问题是,他们为什么在一张桌子上这样做?为每个聊天做一个(例如,“Android每个数据库只能处理10个表”的限制)是否是错误的?

我知道这是一个非常理论性的问题,但也许有人可能会给我一个提示如何正确地做到这一点!

谢谢!

+2

快速执行数据库中的SELECT。 WhatsApp的方法是正确的。使用您的解决方案,您将使用许多磁盘空间资源。最糟糕的是有100个表(每次聊天一次),每个表中有10条消息,有1个表,1000个寄存器。 (我没有downvoted) –

+0

所以你赞成在较高的存储使用率上稍微长一点的处理时间。谢谢,很高兴听到这一点。 –

+0

在这种情况下,是的。很高兴能够帮助你:)如果可以,请使用'order by' SQL语句。 “通过代码”订购更有效率。处理,你需要的将是快速的,我保证;) –

回答

1

好的,经过测试和思考了很多关于数据库结构。我们同意像大多数应用那样做。 尽管加载速度显示为每个对话只有一张表的速度稍快,但这种影响仅在许多消息中显示(例如总共为100,000条消息)。

缺点是组织成本较高,而且结构更容易出错。例如通过会话UUID命名的聊天表。但是一个UUID可能以一个数字开头,这个数字不允许用于表名。

除了一些系统似乎在运行时创建新表时遇到困难,并且像GreenDAO(这似乎是我们最好的选择)的许多DAO框架在运行时组织数据库结构时遇到问题。这使得创建新表和关系成为不可能。

最后但并非最不重要的是,为每个对话生成一张表的想法在“获取上次聊天消息”等情况下很难组织。我们考虑从每个表中查找值(即获取每个表的最后一条消息并使用它们的值),但这会造成很大的开销。

所以长话短说,我们做了三个表

  1. 聊天消息
  2. 作者(每个聊天参与者的名单)
  3. 聊天(会话列表)

希望这帮助。

+0

得到像你一样的问题,希望得到未读的消息与聊天的所有对话的最后一条消息。你有没有找到优化的解决方案?那么请分享你的想法和实时数据库的截屏。 – Mahmudul

+0

那么,不知道你确切的问题是什么,但最终这个想法很简单。聊天表还包含最后一次“阅读”时间,“最后消息文本”等,这使我们能够确定“未读消息的数量”等,迄今为止工作良好。 –