【问题标题】:Which is the best design for a MongoDB database model?哪个是 MongoDB 数据库模型的最佳设计?
【发布时间】: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 并将每个表逐个转换为集合时,通常这是一个糟糕的设计。我们需要更多详细信息,顺便说一句,我会说一个用于用户/团队/公司的集合和一个用于设备的集合。

标签: mongodb database-design nosql


【解决方案1】:

MongodB 为您提供了处理非结构化数据的功能。 每个数据库都可以包含集合,而集合又可以包含文档。 此外,您不能在 mongodB 中使用连接。因此,将信息存储在一个公司模型中是一个更好的选择,因为您不需要加入该场景。 还有一件事,您不需要嵌入所有模型例如:您可以从公司表中获取用户和设备,那么为什么还要嵌入用户和设备?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2023-03-24
    • 2015-12-28
    相关资源
    最近更新 更多