sql - 在 SQL 数据库中存储数组的最佳方式是什么?
问题描述
对于 Android 启动器(主屏幕)应用程序项目,我想实现一个名为“按使用排序”的功能。这将按用户可设置的时间范围内应用程序的启动次数进行排序。
当前实现的想法是存储一组 unich 纪元时间戳,每次启动一个。
此外,它将存储一个计数器,缓存所选时间范围内的当前启动数量,每次启动都会增加。当然,随着时间的推移,这必须定期重建,但只是每隔几个小时或至少在所选时间范围的 x% ,所以计算肯定不会像没有计数器那样频繁地运行,因为每次都需要这些信息屏幕上的任何应用程序条目都需要排序 - 但我不太确定它在实际使用过程中是否有任何影响。
我现在不确定如何将时间戳数组存储在 SQL 数据库中。由于有一个表包含一个记录,其中包含有关每个启动器条目的信息,因此我考虑了以下选项:
- 将 unix epoch 数组以序列化形式(可能是 JSON 数组)存储到条目记录的一个字段中
- 使用 a 为启动时间创建一个单独的表
。每条记录都以与条目关联的 id 开头,然后是所有启动时间,每个字段一个
。每条记录都是条目 id 和一个启动时间的组合,
这些选项显然具有使用适当类型存储时间戳的优点
解决方案
我可能不太明白为什么您的启动计数器需要第二条数据-您保存时间戳的事实已经意味着启动-为什么不只计算时间戳?更少的更新,更少的记录锁定,更多的并发。
现在,假设您有一个单独的表,其中包含经典的一对多设置中的时间戳。 这种设置的优点- 你永远不需要更新任何东西 - 只需继续插入。您可以轻松地按时间戳对表进行聚类,在时间范围内运行过滤器并发出分组依据和行数。然后客户端将获取数字并按计数排序(我相信通常最好不要在 SQL 中排序)。缺点- 您需要连接到父表,并且可能需要正确设置索引。
或者,您可以将时间戳存储在带有主要记录的 blob 文本(JSON、CSV 等)中。这绝对意味着您必须大量更新您的记录,这可能会使您面临锁定问题。然后,我不完全确定您必须做什么才能获得最终的启动计数 - 您读取所有实体,反序列化所有时间戳,按时间范围过滤然后计数?在你的情况下,它确实感觉有点复杂。
我认为没有“最好”的方式。你必须考虑利弊。从我收集到的信息来看,您可能会更好地使用经典的 SQL 方法,除非有一些我没有抓住的东西会超过我上面的观点
推荐阅读
- etl - 列操作
- ios - 如何在 tableView cellforrow 部分中检索这个特定的字典数组 [[String: Any]] 到标签 SWIFT
- python - 将数据从 Nodejs API 发送到 Flask APi
- android - 如何在android中每5秒将用户位置发送到服务器?
- javascript - 如何自动调整 html 中所有列表的大小?
- web - 在 github 部署上呈现未格式化的 Blogdown 网站
- python - 使用 python 将资产(csv 文件)上传到 watson studio 项目
- php - 私人频道上的 laravel 广播不适用于 laravel-echo 和 laravel-websockets
- primefaces - Primefaces 7不在数据表标题中显示换行符
- python - 如何在pygame中移动网格的位置