Mongodb Schema设计:嵌入或引用

时间:2014-05-12 07:52:37

标签: mongodb

我对设计应用程序架构有疑问。我的应用程序处理这些对象的对象和状态。 对象和状态是非常小的对象,就卷而言,它处理数百万个对象,每个对象可以有数百到数万个状态。

应用程序的主要写入操作是添加状态(每个对象每天多次)。 读取操作是各种各样的(对象列表,对象详细信息,许多聚合框架查询以获取有关对象和状态的统计信息)。

我尝试了这两种方法,它适用于具有1000-10000状态的几百个主题,但无法确定哪个更具可扩展性。

嵌入对象:

Objects:
[
    {
        "id": "0000000001",
        "name": "Resource 1",
        "description": "Resource 1",
        "owner": "John Doe",
        "created_at": "2000-01-01T00:00:00.000Z",
        "updated_at": "2000-01-01T00:00:00.000Z",
        "status": [
            {
                "id": "0000000001",
                "position": [0, 0],
                "comment": "comment 1",
                "owner": "John Doe",
                "created_at": "2000-01-01T00:00:00.000Z",
                "updated_at": "2000-01-01T00:00:00.000Z"
            },
            {
                "id": "0000000002",
                "position": [0, 0],
                "comment": "comment 2",
                "owner": "John Doe",
                "created_at": "2000-01-01T00:00:00.000Z",
                "updated_at": "2000-01-01T00:00:00.000Z"
            }
        ]
    }
]

参考对象:

Objects:
[
    {
        "id": "0000000001",
        "name": "Resource 1",
        "description": "Resource 1",
        "owner": "John Doe",
        "created_at": "2000-01-01T00:00:00.000Z",
        "updated_at": "2000-01-01T00:00:00.000Z",
    }
]

Status
[
    {
        "id": "0000000001",
        "object_id": "0000000001",
        "position": [0, 0],
        "comment": "comment 1",
        "owner": "John Doe",
        "created_at": "2000-01-01T00:00:00.000Z",
        "updated_at": "2000-01-01T00:00:00.000Z"
    },
    {
        "id": "0000000002",
        "object_id": "0000000001",
        "position": [0, 0],
        "comment": "comment 2",
        "owner": "John Doe",
        "created_at": "2000-01-01T00:00:00.000Z",
        "updated_at": "2000-01-01T00:00:00.000Z"
    }
]

致以最诚挚的问候,

迈克尔

1 个答案:

答案 0 :(得分:0)

嵌入式模型更受欢迎如果您希望获得最高性能且单个文档较小,则16 megabytes (maximum BSON document size)

当您需要最大可扩展性或某些复杂关系时,

引用模型更为可取。

因此,如果您确定可以适应文档大小限制,则可以使用嵌入式模型。但是如果你想要保证可扩展性 - 请使用引用。


以下是Mongo文档的一些引用:

  

通常,在以下情况下使用嵌入式数据模型:

     
      
  • 您在实体之间拥有“包含”关系

  •   
  • 您在实体之间拥有一对多的关系。在这些关系中,“许多”或子文档总是出现或是   在“一个”或父文件的背景下查看。

  •   
     

参考Model One-to-Many Relationships with Embedded Documents

     

通常,嵌入为读取操作提供了更好的性能,   以及在a中请求和检索相关数据的能力   单一数据库操作。嵌入式数据模型使其成为可能   在单个原子写操作中更新相关数据。

     

通常,使用标准化数据模型:

     
      
  • 嵌入时会导致数据重复,但无法提供足够的读取性能优势   重复的含义。
  •   
  • 代表更复杂的多对多关系。
  •   
  • 为大型分层数据集建模。
  •   
     

引用提供了比嵌入更多的灵活性。然而,   客户端应用程序必须发出后续查询来解决问题   引用。换句话说,标准化数据模型可能需要更多   往返服务器。

     

参考Model One-to-Many Relationships with Document References