我正在为我正在构建的 Web 应用程序研究 MongoDB。来自 MySQL 背景,嵌入式文档的概念并不是那么容易完全理解。
假设我有一个名为的文档blogpost
,它看起来像这样:
db.posts.save({
_id: 1
title: "first post!",
body: "post content",
author: {
_id: 1,
name: 'John'
email: 'jonh@doe.com'
},
comments: [
{
_id: 20,
author: 'mary',
content: 'This blog post is cool!'
}
]
});
Run Code Online (Sandbox Code Playgroud)
每个作家实际上将被存储在在authors
收集,当我保存blogpost
,我只会从复制数据author
文件,并将其粘贴所以它嵌入在blogpost
文件。这是一个好方法吗?
我担心的是,当约翰更新他的电子邮件地址时,它只会在authors
集合中更新。他的一些较早的博文会显示一个过时的电子邮件地址。
MongoDB 是否有处理该问题的方法,还是我需要在我的应用程序代码中自己做?
如果我在我的应用程序代码中这样做,那么首先将作者嵌入到博客文章中有什么意义?我可以只存储引用 ,author _id
并在单独的查询中查找作者。
另一方面,如果我需要存储历史数据,例如带有客户信息的发票,那么将客户文档嵌入到发票文档中是有意义的,因为发票需要显示创建发票时存在的客户数据.
对于评论部分,我已经阅读了多集合 vs 嵌入式文档,当谈到评论时,多集合似乎是要走的路。http://mongly.com/Multiple-Collections-Versus-Embedded-Documents/
那么,总的来说 - 我是否完全错过了嵌入式文档的重点?
你没有错过重点:)
关键是当您存储/更新/获取集合中的各种实体时,必须执行多少次读取和多少次写入?
您可能会不断(每天?)创建新帖子并经常创建新评论,并且非常频繁地查询帖子。
与上述相比,更新作者电子邮件之类的操作非常罕见。您希望优化应用程序中每次发生数百或数千次的读取和写入的性能,而不必担心非常不频繁的操作的性能。
话虽如此,我会存储帖子中嵌入的基本作者信息,但我只会存储每篇帖子都必须显示的信息。如果我想将有关作者的其他详细信息保留在自己的集合中,我希望用户需要单击其他链接才能查看这些详细信息(留出时间进行另一次阅读)。
归档时间: |
|
查看次数: |
1603 次 |
最近记录: |