在DB中存储大量(简单)时间线图数据

时间:2010-07-14 21:54:07

标签: database database-design data-structures timeline

我需要存储播客/音频文件每秒的播放次数。这将生成一个简单的时间线图(如Google Analytics中的“点击”图表),x轴上有秒,并在y轴上播放。

然而,这些播客可能会持续长达3个小时,每秒播放100,000次并不是不切实际的。这是10,800秒,每个最多100,000次。显然,将每个在自己的行中存储第二个是不现实的(它会产生10亿行),因为我希望能够快速获取这些原始数据。

所以我的问题是:我如何才能最好地存储这些大量的时间线数据?

我的一个想法是使用text / blob列,然后用逗号分隔播放,每个逗号代表一个新的秒(按顺序),然​​后是第二个播放次数的数字。因此,如果第二场比赛中有100,000场比赛,第二场比赛中有90,000场比赛,第二场比赛则有95,000场比赛,那么我会将其存储起来:文本/ blob列中的“100000,90000,95000,[...]”。

这是存储此类数据的可行方法吗?还有更好的方法吗?

谢谢!

编辑:数据被跟踪到另一个源,我只需要每15分钟更新一次原始图数据。因此,快速读取是主要关注点。

注意:由于这个项目的性质,每个玩过的第二个都必须单独跟踪(换句话说,我不能只跟踪每个游戏的'开始'和'结束')。

4 个答案:

答案 0 :(得分:1)

blob存储问题是您需要为所有更改更新整个blob。这不一定是坏事。使用您的格式:(100000,90000,...),7 * 3600 * 3 = ~75K字节。但这意味着你每秒都会为每场比赛更新75K blob。

当然,blob对SQL是不透明的,所以“什么歌曲中播放次数最多的第二部分”将是SQL级别的一个不可能的查询(这基本上是对要学习的所有数据的表扫描)

并且有很多解析开销将数据输入和输出。

另一方面。播客ID(4个字节),第二个偏移(2个字节无符号允许pod转换长达18小时),播放计数(4个字节)=每秒10个字节。因此,减去任何阻塞开销,3小时的歌曲是3600 * 3 * 10 =每首歌108K字节。

如果您将其存储为blob,vs文本(longs块),则为4 * 3600 * 3 = 43K。

因此,第二个/行结构“仅”是二进制blob的两倍大小(在完美的世界中,请参阅数据库服务器以获取详细信息)。考虑到额外的好处,这使您能够查询事物,这可能值得做。

如果您需要进行大量更新(一首歌只需要几秒钟),那么只有第二行/每行的下行,这是DB的大量UPDATE流量,而使用blob方法,这可能是单一更新。

您的流量模式会影响更多。

答案 1 :(得分:0)

使用每一秒是否有问题,每秒播放多少次? 这意味着10K行,这不错,你只需要每秒用当前数据插入一行。

编辑:我会说这个解决方案比在TEXT列中用逗号分隔的东西更好...特别是因为获取和操作数据(你说你想做的)会非常混乱。

答案 2 :(得分:0)

我认为这是一个键值问题。

for each second played

   Song[second] += 1

end

作为关系数据库 -

song
----
name | second | plays

一个hack psuedo-sql开始第二个:

insert into song(name, second, plays) values("xyz", "abc", 0)

和另一个更新第二个

update song plays = plays + 1 where name = xyz and second = abc

一个3小时的播客将有11K行。

答案 3 :(得分:0)

这实际上取决于生成数据的内容..

据我所知,您希望实现一个地图,其中键是第二个标记,值是播放次数。

您要加载的活动,工作单元或交易中的部分是什么?

我可以假设您在播客名称,开始和停止时间都有播放事件 你想加载到地图中进行分析和演示吗?

如果是这种情况,你可以有一张桌子

  • podcastId
  • secondOffset
  • playCount

每个人甚至会更新开始和结束位置之间的行

更新t 设置playCount = playCount +1 其中podCastId = x 和y和z之间的secondOffset

然后插入一个插件,在playcount为1的情况下,在start和stop之间添加不存在的行,除非你用零预加载表。

根据数据库的不同,您可以设置稀疏表,其中不存储空列,从而提高效率。