哪个是 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模式模型设计及编码-Mongoose

时序数据库时间序列数据和MongoDB第三部分-查询分析和呈现时间序列数据

MongoDB / Mongoose 单元测试 - 最佳实践? [关闭]

Mongodb数据模型