哪个是 MongoDB 数据库模型的最佳设计?
Posted
技术标签:
【中文标题】哪个是 MongoDB 数据库模型的最佳设计?【英文标题】:Which is the best design for a MongoDB database model? 【发布时间】:2021-10-09 14:10:08 【问题描述】:我觉得我当前数据库的 MVP 需要进行一些设计更改。用户数量增长很快,我们在某些请求中表现不佳。我还想摆脱我们使用的所有 DBRef。
我们目前的模型可以总结如下:
一家公司可以有多名员工(数千名) 一个公司可以有多个团队(数百个) 员工可以成为团队的一员 一家公司可以拥有多台设备(数千台) 一名员工受到多台设备的影响我们的应用程序显示在不同的页面中:
公司资料 用户 设备 团队我想我有不同的选择,但我对 MongoDB 不够熟悉,无法做出最佳决定。
选项 1
不要为一对多关系嵌入和使用 id 列表。
// Company document
"companyName": "ACME",
"users": [ObjectId(user1), ObjectId(user2)],
"teams": [ObjectId(team1), ObjectId(team2)],
"devices": [ObjectId(device1), ObjectId(device2)]
// User Document
"userName": "Foo",
"devices": [ObjectId(device2)]
// Team Document
"teamName": "Foo",
"users": [ObjectId(user1)]
// Device Document
"deviceName": "Foo"
选项 2
嵌入数据和重复信息。
// User Document
"companyName": "ACME",
"userName": "Foo",
"team":
"teamName": "Foo"
,
"device":
"deviceName": "Foo"
// Team Document
"teamName": "Foo"
"companyName": "ACME",
"users": [
"userName": "Foo"
]
// Device Document
"deviceName": "Foo",
"companyName": "ACME",
"user":
"userName": "Foo"
选项 3
不要在一对一关系中嵌入和使用 id。
// Company document
"companyName": "ACME"
// User Document
"userName": "Foo",
"company": ObjectId(company),
"team": ObjectId(team1)
// Team Document
"teamName": "Foo",
"company": ObjectId(company)
// Device Document
"deviceName": "Foo",
"company": ObjectId(company),
"user": ObjectId(user1)
MongoDB 建议尽可能多地嵌入数据,但我认为不可能将所有数据嵌入公司文档中。一家公司可以拥有多个设备或用户,我认为它可能会变得太大。
我正在从 SQL 切换到 NoSQL,我想我自己还没有弄清楚!
谢谢!
【问题讨论】:
Mongo 传统上建议对所有数据进行非规范化处理。 当您从 SQL 迁移到 NoSQL 并将每个表逐个转换为集合时,通常这是一个糟糕的设计。我们需要更多详细信息,顺便说一句,我会说一个用于用户/团队/公司的集合和一个用于设备的集合。 【参考方案1】:MongodB 为您提供了处理非结构化数据的功能。 每个数据库都可以包含集合,而集合又可以包含文档。 此外,您不能在 mongodB 中使用连接。因此,将信息存储在一个公司模型中是一个更好的选择,因为您不需要加入该场景。 还有一件事,您不需要嵌入所有模型例如:您可以从公司表中获取用户和设备,那么为什么还要嵌入用户和设备?
【讨论】:
以上是关于哪个是 MongoDB 数据库模型的最佳设计?的主要内容,如果未能解决你的问题,请参考以下文章
时序数据库时间序列数据和MongoDB第三部分-查询分析和呈现时间序列数据