6

我有一个 GPS 跟踪应用程序的数据模型问题。当有人使用我们的应用程序时,它会每 5 秒保存一次纬度、经度、当前速度、时间戳和燃烧卡路里。锻炼完成后,锻炼的平均速度、总时间/距离和消耗的卡路里将存储在数据库中。到目前为止,一切都很好..

我们还想要存储每 5 秒保存一次的数据,以便我们稍后可以利用它来绘制锻炼的图形/图表。

我们应该如何将这么多的数据存储在数据库中?如果有人跑了一个小时,一次锻炼可以包含 720 行。可能是单行中的序列化/gz 压缩数据数组。我知道这是不好的做法..

关系型一对/多对多模型将被撤消?我知道 MySQL 可以轻松处理大量数据,但我们谈论的是 720 * 每周两次锻炼 * 7000 名用户 = 每周超过 1000 万行。(当然,我们只能存储每 10 秒的数据以将行数减半,或者每 20 秒等……但随着时间的推移,它仍然会是大量数据+图表的准确性会降低)

你会怎么做?提前感谢您的意见!

4

1 回答 1

8

只是一些想法:

  1. 量化您的纬度/经度数据。我相信由于技术原因,数据很可能已经被量化了,所以如果你能检测到这种量化,你可能会使用它。这里的想法是将双精度数转换为合理的整数。在最坏的情况下,您可能会量化为提供的精度双精度数,这意味着使用 64 位整数,但我非常怀疑您的数据是否接近该分辨率。也许一个边长大约一米的简单网格对你来说就足够了吗?
  2. 计算差异。就绝对值而言,大多数数字都相当大,但也非常接近(除非您的成员跑遍世界的一半……)。所以这将导致相当小的数字。此外,只要人们以恒定的速度向恒定的方向奔跑,您就会经常看到相同的差异。步骤 1 中的空间网格越粗糙,您在此处获得完全相同的差异的可能性就越大。
  3. 计算这些差异的霍夫曼码。您可以尝试分别编码 lat 和 long 运动,或者在其叶子处计算具有 2d 位移矢量的单个代码。尝试两者并比较结果。
  4. 将结果存储在 BLOB 中,连同用于解码 Huffman 代码的字典以及初始位置,以便您可以将数据返回到绝对坐标。

结果应该是每个数据集的一小部分数据,您可以将其作为一个整体进行检索和解压缩。从数据库中检索单个部分是不可能的,但听起来你不需要那个。

霍夫曼编码优于 gzip 的好处是您不必人为地引入中间字节流。使用它们各自的属性直接编码您遇到的实际差异应该会更好。

于 2012-11-02T15:46:21.183 回答