什么模式用于在Mongo中存储和检索记录审计跟踪?

时间:2016-03-28 01:11:06

标签: mongodb

我正在研究使用Mongo来存储我的数据。我希望每次更改都将一个文档存储到记录中。例如,记录表示日历事件。每次更新此事件(通过Web表单)时,我都希望将新版本存储在新文档中。这将允许根据请求检索此事件的历史详细信息。

如果我使用关系数据库存储此数据,我会有一个“events”表和一个“events_history”表:

'events' table:
event_id
last_event_history_id

'events_history' table:
event_history_id
event_id
event_date

所以,当我想要检索事件列表(显示每个事件的最新历史记录)时,我会这样做:

SELECT * FROM events_history eh, events e 
WHERE 
eh.events_history_id = e.last_event_history_id

但是,如果使用Mongo,我不确定如何处理存储数据并生成此列表?

1 个答案:

答案 0 :(得分:2)

乔,

对于从RDBMS背景到MongoDB的人来说,你的问题经常出现问题(BTW就是我个人来到MongoDB的方式)

我可以提问你。

如果我以一般方式重述你的问题,我会说:

  

如何在MongoDB中建模一对多关系?

基本上有两种方法:

  1. 嵌入式文件
  2. 你可以参加"活动"采集。此集合中的文档可以包含"密钥"调用" Event_history,其中每个条目都是"旧版本"事件本身。

    The discussion on embedded documents for MongoDB is here.

    1. 文件参考
    2. 这与您在关系数据库中的操作非常相似。您可以拥有两个集合,每个集合都有自己的文档。一个集合用于"活动"事件和一个历史事件集合

      The discussion for Document references in MongoDB is here

      现在回到你的问题:这两种方法中的哪一种更好。

      需要考虑几个因素

      1 - MongoDB当前没有基于数据库的连接 - 如果您的工作负载主要是读取,并且您的文档/事件不经常更改,嵌入式文档的方法将更容易并且具有更好的性能。

      2 - 避免增长文件。如果您的事件频繁更改导致MongoDB文档增长,那么您应该选择带有引用的设计#2。 "文件增长"与MongoDB一起规模通常不是最佳性能选择。 An in-depth discussion of why document growth should be avoided is here

      如果不了解有关您应用的详细信息,我倾向于猜测"对于历史是重要特征的事件管理系统,文档引用会更好。有2个单独的集合,并在您的应用程序内执行连接。