MongoDB模式设计/加入monogo db

时间:2017-10-28 14:41:22

标签: mongodb database-schema

我是MongoDB的新手,具有很强的SQL背景,不知道设计以下场景的理想方式是什么:

我有一组机器将ping发送到主机,我需要知道哪些机器在过去10分钟内发送了ping。

我有两个系列:

  1. pings - 一个非常大的集合,每台机器每隔10分钟发送一次ping。
  2. machines - 非常小的集合,大约1000台机器
  3. 我需要查询“Alive”机器,即在过去10分钟内发送ping的所有机器。

    目前我的架构如下:

    pings = {
        _id       - ObjectID
        machineID - ObjectID
        pingTime  - ISODate
    }
    
    machines = {
        _id       - ObjectID
        name      - String
        type      - string
    }
    

1 个答案:

答案 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的索引,它会闪电般快,只涉及一个集合。即使您更改了计算机名称,与检查这些计算机的上行状态(?)相比,这应该是一个相当罕见的用例。