场景:一个叫做“accessPoint”的实体有一个叫做“network”的重要属性。应用程序将显示此网络属性的某些部分,因此我决定将其存储在 accessPoint 文档中。
我还决定将所有网络文档(带有附加属性)存储在一个单独的集合中(出于性能原因:它将用于前端的自动完成输入)
accessPoint: {
id: ObjectId,
name: String,
uptime: Number,
network: {
subnet: String,
netmask: Number
}
}
network: {
_id: ObjectId
subnet: String,
netmask: Number,
size: Number,
validatedAt: Date,
attrX: String,
attrY: String,
attrZ: String
}
我有 3 个主要问题: 1 - 将网络存储在单独的集合中是一种好习惯吗?(注意上面的要求)
2 - 在这两个文档(如 SQL DBMS)之间建立关系是否存在任何合规/约定问题?
3 - 而且,我想知道......我可以将 _id 存储为 String 而不是 ObjectId 吗?我已经阅读了一些建议,但我对此没有决定性的意见。例如:(... network: { _id: "192.168.1.0/24" }
保证唯一性:D)
谢谢!
这取决于您的应用程序以及您如何使用它们,但我可以说集合设计还可以。
通常,No-SQL 数据库不用于关系集合。
是的你可以。顺便说一句,mongodb 保证了唯一性。因为
_id
字段默认具有唯一索引。以下是对您的问题的一些澄清:
这取决于您的应用程序功能和数据。
accessPoint
问题之一是这两个实体之间的关系是什么network
?是一对一、一对多还是多对多。下一个问题是,您的重要疑问是什么?哪些查询被频繁访问并且在用户体验、性能等方面很重要。
通常,一对一关系应该建模为单个文档。即
accessPoint
作为network
一份文件。请注意,每个 MongoDB 文档最多可以存储 16 MB 的数据。一对多关系可以建模为单个实体,也可以建模为两个实体。最好将相关信息存储在一起,以便可以一起访问。
引用或关系涉及两个实体,在这种情况下是
network
相关信息。理想情况下,它应该是
network
实体的唯一字段。这意味着,将nework
实体的_id
字段(也)存储network
在accessPoint
. 这network._id
可以用作参考(或关系)字段。MongoDB 聚合框架允许在相关集合之间“加入”查询 - $lookup聚合阶段允许这样做。因此,如果您需要将两个集合中的数据作为单个查询访问,请使用
$lookup
.访问单个集合的查询可以很容易地形成并且比使用聚合查询执行得更好
$lookup
。_id
field 可以是任何 MongoDB BSON 类型,数组字段类型除外。_id
关于该领域需要注意的其他重要事项是: