我是MongoDB的新手,具有很强的SQL背景,不知道设计以下场景的理想方式是什么:
我有一组机器将ping发送到主机,我需要知道哪些机器在过去10分钟内发送了ping。
我有两个系列:
pings
- 一个非常大的集合,每台机器每隔10分钟发送一次ping。machines
- 非常小的集合,大约1000台机器我需要查询“Alive”机器,即在过去10分钟内发送ping的所有机器。
目前我的架构如下:
pings = {
_id - ObjectID
machineID - ObjectID
pingTime - ISODate
}
machines = {
_id - ObjectID
name - String
type - string
}
答案 0 :(得分:1)
MongoDB中的数据建模与SQL的工作方式不同。使用SQL,您可以识别您的实体,它们的属性以及它们之间的关系,然后您可以直接碰壁,让您的JOIN正确回答您的用例中出现的问题。
使用MongoDB和 - 在不同程度上 - 其他NoSQL数据库,数据建模的工作方式不同:您首先确定用例首先出现的问题,然后相应地建模数据 em>以便以最有效的方式回答问题。
我们假设您有一个Web应用程序,您可以在其中查看计算机列表,然后单击要获取计算机详细信息的单个计算机。所以我们有一个我们想要检查的已知机器。这听起来很简单,这在这里很重要。假设您的列表是从machines
模型生成的,那么您已掌握了生成机器详细信息视图的所有信息:
db.pings.find({machineID:givenmachine["_id"]})
对于您描述的用例,我会稍微更改ping
数据模型:
{
_id: new ObjectID(),
machine: "host.example.com",
pingTime: new ISODate()
}
原因:与流行的信念相反,冗余本身并不是坏事。 Unneccesary 冗余是。但是您的用例会对其进行验证,因为它会使您的查询更多更有效:
t = new Date()
t.setMinutes(t.getMinutes() - 10);
db.pings.distinct("machine",{pingTime:{$gte:t}})
拥有pingTime的索引,它会闪电般快,只涉及一个集合。即使您更改了计算机名称,与检查这些计算机的上行状态(?)相比,这应该是一个相当罕见的用例。