2017-10-28 81 views
0

我是新来的MongoDB在SQL强大的背景,不知道什么是设计以下场景的理想方式:MongoDB的架构设计/参与monogo分贝

我已经设置发送ping来机主机,我需要知道哪些机器在过去10分钟内发送了ping。

我有2个类别:

  1. pings - 一个非常大的集合,每个机发送ping大约每隔10分钟。
  2. machines - 漂亮的小集合,约少1000台机器

,我需要查询的“活着”的机器,即所有在最后10分钟发送Ping的机器。

目前我的模式是这样的:MongoDB中

pings = { 
    _id  - ObjectID 
    machineID - ObjectID 
    pingTime - ISODate 
} 

machines = { 
    _id  - ObjectID 
    name  - String 
    type  - string 
} 

回答

1

数据建模的工作方式不同比SQL。使用SQL,您可以识别您的实体,它们的属性和它们之间的关系,然后将您的头靠在墙上,让您的JOIN正确回答您的使用案例中出现的问题。

用的MongoDB和–有不同程度–其他NoSQL数据库,数据建模的工作方式不同:您确定您的使用情况第一出现的问题,你的数据模型相应,使问题能够得到回答以最有效的方式。

让我们假设您有一个Web应用程序,您可以在其中看到机器列表,然后单击要获取机器详细信息的单个机器。所以我们有一台我们想要检查的已知机器。这听起来很简单,但在这里很重要。假设你的列表是从您的machines模型生成的,你已经有了手头的所有信息生成机详细信息视图:

db.pings.find({machineID:givenmachine["_id"]}) 

对于您所描述的使用情况下,我会改变ping数据模型位:

{ 
    _id: new ObjectID(), 
    machine: "host.example.com", 
    pingTime: new ISODate() 
} 

原因:与普遍认为冗余并不是坏事本身相反。 不必要的冗余是。但是你的使用情况验证它,因为它使您的查询更高效:

t = new Date() 
t.setMinutes(t.getMinutes() - 10); 
db.pings.distinct("machine",{pingTime:{$gte:t}}) 

对pingTime指数,这将是快如闪电,只有一个集合参与。即使您更改了机器名称,与检查这些机器的状态(?)相比,这应该是一个相当罕见的用例。

+0

谢谢,我想过冗余(它被称为在mongo中嵌入不是?)但如果我还想要关于机器的一堆属性呢?所以我会以一个大的ping文档结束......我不知道mongo是否适合我的用例,或者我应该留在RDBMS中...... – Michael

+1

@Michael因此,您应该直接得到所有问题*首先* ,在建模之前。但是,对于发送ping的主机,您有一个有效的查询,现在您可以为有限的子集执行'db.machines.find({name:{$ in:resultset}})'。更好的是,假设你想要一个细节页面,你只需要做一个简单的查询,比如'db.machines.find({name:nameOfMachineYouWantTheDetailsFor})''。 –

+0

嗯..我明白你说了什么,在SQL中进行所有标准化之后,再想这么做... 你知道从sql到mongo的“迁移”教程吗?也许在SQL中实现的场景以及它在Mongo中如何实现? – Michael