文件设计

时间:2012-02-16 22:34:39

标签: nosql ravendb

我正在尝试一些不同的选项来在RavenDB中以有效的方式设计和存储文档结构。

我正在处理用户的结构是会话和活动跟踪信息。

当用户登录系统并开始创建活动时,将启动会话。每个会话可能有数百个活动。 当用户关闭/注销时,会话结束。

使场景稍微复杂化的一个因素是会话实时显示在门户网站中。换句话说:我需要跟踪会话和活动并将它们关联起来,以便能够确定它们是否正在进行(以及它们已经运行了多长时间),或者它们是否已完成。

你也可以在历史中挖掘。

我做了一些研究,发现堆栈溢出的两个相关问题,但没有一个真正帮助我: Document structure for RavenDB Activity stream design with RavenDb

我成功飙升的两个选项是:(简化结构)

1:

{
  "User": "User1",
  "Machine": "machinename",
  "StartTime": "2012-02-13T13:11:52.0000000",
  "EndTime": "2012-02-13T13:13:54.0000000",
  "Activities": [
    {
      "Text": "Loaded Function X",
      "StartTime": "2012-02-13T13:12:10.0000000",
      "EndTime": "2012-02-13T13:12:10.0000000"
    },
    {
      "Text": "Executed action Z",
      "StartTime": "2012-02-13T13:12:10.0000000",
      "EndTime": "2012-02-13T13:12:10.0000000"
    }
}

2:

{
  "Session" : "SomeSessionId-1",
  "User": "User1",
  "Machine": "machinename",
  "Text": "Loaded Function X",
  "StartTime": "2012-02-13T13:12:10.0000000",
  "EndTime": "2012-02-13T13:12:10.0000000"
}

{
  "Session" : "SomeSessionId-1",
  "User": "User1",
  "Machine": "machinename",
  "Text": "Executed action Z",
  "StartTime": "2012-02-13T13:12:10.0000000",
  "EndTime": "2012-02-13T13:12:10.0000000"
}

替代方案1感觉更自然,来自关系背景,加载会话,添加事件和存储非常简单。每次加载Session对象和附加事件的开销对插入性能都非常不利。

替代方案2感觉更有效率,我可以简单地追加事件(几乎像事件采购)。但是,在事件中挖掘并在每个会话中显示它们时的选择会变得更复杂。

是否还有第三种更好的选择? 解决方案是否可以分离事件并创建另一个读取模型? 我是否过分复杂了这个问题?

2 个答案:

答案 0 :(得分:0)

看起来您只需要一个用户文档和一个会话文档。为“User”和“Session”创建两个模型。会话doc将userid作为一个属性。会话也将嵌套“活动”属性。在这种情况下,很容易显示实时用户 - 会话 - 活动。在不了解更多细节的情况下,我过度简化了课程。

编辑:

//Sample User Document

{
  UserId:"ABC01",
  HomeMachine:"xxxx",
  DateCreated:"12/12/2011"
}


//Sample Session Document

{
  UserId:"ABC01",
  Activities
    {
      Activity 1 properties
    }
    {
      Activity 2 properties
    }
    ...
    ...
    etc..

}

答案 1 :(得分:0)

我绝对认为你应该使用选项2的一些变体。选项1中的文档是否会变得非常大?这可能会使插入非常慢。 我真的不明白为什么每个会话的显示事件在选项2中比在选项1中更复杂,你可以通过会话选择事件

session.Query<Event>().Where(x => x.Session == sessionId)

并且RavenDB会自动为它创建索引。如果你想制作更复杂的查询,你总是可以为它创建更专业的索引。