2017-10-28 84 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