首页 > 解决方案 > 在 SQL 数据库中存储数组的最佳方式是什么?

问题描述

对于 Android 启动器(主屏幕)应用程序项目,我想实现一个名为“按使用排序”的功能。这将按用户可设置的时间范围内应用程序的启动次数进行排序。

当前实现的想法是存储一组 unich 纪元时间戳,每次启动一个。
此外,它将存储一个计数器,缓存所选时间范围内的当前启动数量,每次启动都会增加。当然,随着时间的推移,这必须定期重建,但只是每隔几个小时或至少在所选时间范围的 x% ,所以计算肯定不会像没有计数器那样频繁地运行,因为每次都需要这些信息屏幕上的任何应用程序条目都需要排序 - 但我不太确定它在实际使用过程中是否有任何影响。

我现在不确定如何将时间戳数组存储在 SQL 数据库中。由于有一个表包含一个记录,其中包含有关每个启动器条目的信息,因此我考虑了以下选项:

标签: sqlarrayssqlitedatabase-design

解决方案


我可能不太明白为什么您的启动计数器需要第二条数据-您保存时间戳的事实已经意味着启动-为什么不只计算时间戳?更少的更新,更少的记录锁定,更多的并发。

现在,假设您有一个单独的表,其中包含经典的一对多设置中的时间戳。 这种设置的优点- 你永远不需要更新任何东西 - 只需继续插入。您可以轻松地按时间戳对表进行聚类,在时间范围内运行过滤器并发出分组依据和行数。然后客户端将获取数字并按计数排序(我相信通常最好不要在 SQL 中排序)。缺点- 您需要连接到父表,并且可能需要正确设置索引。

或者,您可以将时间戳存储在带有主要记录的 blob 文本(JSON、CSV 等)中。这绝对意味着您必须大量更新您的记录,这可能会使您面临锁定问题。然后,我不完全确定您必须做什么才能获得最终的启动计数 - 您读取所有实体,反序列化所有时间戳,按时间范围过滤然后计数?在你的情况下,它确实感觉有点复杂。

我认为没有“最好”的方式。你必须考虑利弊。从我收集到的信息来看,您可能会更好地使用经典的 SQL 方法,除非有一些我没有抓住的东西会超过我上面的观点


推荐阅读