【发布时间】: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