1

我正在设计一个应该存储事件的系统。每个事件都有三个基本属性:
1. 时间戳(64 位)
2. 密钥(它是什么)。
3. value(事件的实际值)。

事件键通常是字符串,事件值几乎总是数字。

到目前为止很简单,但是,这里有点泥泞。事件系统应该允许向下钻取到非常高的级别。这意味着什么最好用一个例子来说明:

注意:为简洁起见,省略了时间戳。

key: hits // 可能是每小时,也可能是最后一秒,key 是特定于应用程序的,由用户决定他的应用程序多久向我们报告此事件。
价值:12000
 // 钻取从这里开始。
 关键:美国
 价值:5000
  键:State1
   价值:2000
    键:City1
    价值:500
 关键:英国
 价值:5000
  键:StateN
   价值:20
 // 到任意级别。

所以,正如你在上面看到的,这个值实际上变成了一棵树。有人可能会说,为什么不独立存储每个 k/v 并维护一个“父键”,由于写入增加(最终,当查找事件时,读取负载),这将是低效的。在一次操作中将它们写出并一次读回整个对象会更有效率。

我想知道如何最好地设计这个。这些对象本质上是一个 C++ 类(尽管为了互操作性,它实际上是一个序列化框架 ala 协议缓冲区/节俭)。

事件系统与应用程序无关,但我想要一个很好的 API 来为客户端提供直观的。

你以前设计过这样的东西吗?想法?你认为最好的方法是什么?

先感谢您。

PS:预计每天会有几百万个事件,我们将根据数据构建图表。

4

2 回答 2

0

您可以扩展日志文件定义以提供“组”或“包”类型的日志标记吗?

例如 :

组:美国键:State1
值:7000
键:State2
值:65191

组:英国...

这样你就可以解决每个组的解析......如果这就是你正在寻找的......

于 2011-01-17T11:58:10.203 回答
0

想到的一个想法也是为您的条目提供第四个属性:父日志条目 ID。使用像 ActiveRecord 这样的 ORM,您可以形成一棵自然树。例如:

class LogEntry < ActiveRecord::Base
    has_one :parent_log_entry
    has_many :log_entries
end

(这肯定是不正确的,但你会明白的)。

ActiveRecord 方案有各种语言的各种实现,所以这与语言(和 DB)无关。

于 2011-01-17T12:01:15.863 回答