我正在研究使用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,我不确定如何处理存储数据并生成此列表?
答案 0 :(得分:2)
乔,
对于从RDBMS背景到MongoDB的人来说,你的问题经常出现问题(BTW就是我个人来到MongoDB的方式)
我可以提问你。
如果我以一般方式重述你的问题,我会说:
如何在MongoDB中建模一对多关系?
基本上有两种方法:
你可以参加"活动"采集。此集合中的文档可以包含"密钥"调用" Event_history,其中每个条目都是"旧版本"事件本身。
The discussion on embedded documents for MongoDB is here.
这与您在关系数据库中的操作非常相似。您可以拥有两个集合,每个集合都有自己的文档。一个集合用于"活动"事件和一个历史事件集合
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个单独的集合,并在您的应用程序内执行连接。