【问题标题】:Best way of storing an array in an SQL database?在 SQL 数据库中存储数组的最佳方法是什么?
【发布时间】:2020-04-08 15:43:38
【问题描述】:

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

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

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

  • 将 unix epoch 数组以序列化形式(可能是 JSON 数组)存储到条目记录的一个字段中
  • 使用
    为启动时间创建一个单独的表 一种。每条记录都以与条目关联的 id 开头,然后是所有启动时间,每个字段一个
    湾。每条记录一个条目 ID 和一个启动时间的组合
    这些选项显然具有使用适当类型存储时间戳的优势

【问题讨论】:

  • 任何数据库必须保存“任意数量的项目”的一件事是一个表 ...
  • @marc_s 是的!但仍然:选择b。或选项 a。是要走的路吗?

标签: sql arrays sqlite database-design


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2015-04-07
    • 2016-05-19
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多