我对设计应用程序架构有疑问。我的应用程序处理这些对象的对象和状态。 对象和状态是非常小的对象,就卷而言,它处理数百万个对象,每个对象可以有数百到数万个状态。
应用程序的主要写入操作是添加状态(每个对象每天多次)。 读取操作是各种各样的(对象列表,对象详细信息,许多聚合框架查询以获取有关对象和状态的统计信息)。
我尝试了这两种方法,它适用于具有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"
}
]
致以最诚挚的问候,
迈克尔
答案 0 :(得分:0)
嵌入式模型更受欢迎如果您希望获得最高性能且单个文档较小,则16 megabytes (maximum BSON document size)
当您需要最大可扩展性或某些复杂关系时,引用模型更为可取。
因此,如果您确定可以适应文档大小限制,则可以使用嵌入式模型。但是如果你想要保证可扩展性 - 请使用引用。
以下是Mongo文档的一些引用:
通常,在以下情况下使用嵌入式数据模型:
您在实体之间拥有“包含”关系
您在实体之间拥有一对多的关系。在这些关系中,“许多”或子文档总是出现或是 在“一个”或父文件的背景下查看。
参考Model One-to-Many Relationships with Embedded Documents
通常,嵌入为读取操作提供了更好的性能, 以及在a中请求和检索相关数据的能力 单一数据库操作。嵌入式数据模型使其成为可能 在单个原子写操作中更新相关数据。
通常,使用标准化数据模型:
- 嵌入时会导致数据重复,但无法提供足够的读取性能优势 重复的含义。
- 代表更复杂的多对多关系。
- 为大型分层数据集建模。
引用提供了比嵌入更多的灵活性。然而, 客户端应用程序必须发出后续查询来解决问题 引用。换句话说,标准化数据模型可能需要更多 往返服务器。