【问题标题】:Document design with multiple embedded documents具有多个嵌入文档的文档设计
【发布时间】:2013-12-11 14:17:45
【问题描述】:

我有一个关于 MongoDB 的架构问题。我有一个包含 6 个不同相关实体的用户表。

public class Profile
{
    public List<Entity1> {get;set;}
    public List<Entity2> {get;set;}
    public List<Entity3> {get;set;}
    public List<Entity4> {get;set;}
    public List<Entity5> {get;set;}
    public List<Entity6> {get;set;}
}

当我显示个人资料页面时,我必须显示与个人资料相关的所有数据。阅读 MongoDB 教程后,我最初的设计是将所有六个文档嵌入到 Profile 文档中。但我担心,它可能会超过文件大小。所以目前我有 6 个单独的集合,每个集合实体都有一个 ProfileId(Indexed)。在 Profile 视图中,我根据 ProfileId 进行 6 次不同的数据库调用并显示所有结果。

public class Entity1
{
  public int ProfileId {get;set;}
  ......
  ........
}

这可以接受吗?

谢谢!

【问题讨论】:

    标签: mongodb database nosql


    【解决方案1】:

    截至mongo 2.4,最大文档大小为 16MB,这在没有任何 BLOB 或其他内容的情况下是相当大的。因此,如果您总是想检索嵌入所有列表的整个配置文件,绝对是您的首选。

    在不了解您的用例的情况下,我通常会遇到基于 mongo 构建的应用程序由于查询过多而变慢的情况,尤其是在您使用远程数据库时。请记住,mongo 不支持连接,因此访问 7 个集合实际上意味着 7 次往返!

    因此,我会从嵌入式解决方案开始,不时测量文档大小以检查大小。如果 16MB 真的不够,您可能会有一个单一的实体列表变得太大 - 在这种情况下,我只会将这个单一的列表提取到它自己的集合中。

    如果您希望获得最大的灵活性,例如在评估文档大小时能够轻松切换,您还可以像现在一样将数据存储到其他 6 个实体集合中,但无需读取它们。如果您稍后必须切换,您只需更改相应的查询并从 Profile 集合中删除嵌入的字段。

    【讨论】:

    • 谢谢!我真的很喜欢你也有个人收藏的想法。我在个人资料页面上显示了一个侧边栏,例如显示具有相似技能的人。我可以为此目的查询各个集合吗?
    • 我可能不得不作为一个单独的问题提出这个问题,我有一个 2 GB VPS,我打算在其中安装 MongoDB 以及我的网站,这是否足以开始?
    • @user636525 确保您可以查询各个集合!但是通过适当的索引,您可能可以获得与嵌入式解决方案几乎相同的性能。 mongo 的好处在于它实际上是为了满足您的个人需求。如果您想存储非规范化数据或任何类型的预聚合,只要有明确的理由就可以这样做。
    • 您的第二条评论确实是一个单独的问题,我个人对运行 mongod 实例的最低硬件要求不是很有经验 - 我只能说我从来没有遇到过太多麻烦开发机器(16GB)...
    • 谢谢,我会尝试找出是否有人有在 windows VPS 环境中部署 MongoDB 的经验。
    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2019-03-19
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2022-10-16
    • 1970-01-01
    相关资源
    最近更新 更多