簡體   English   中英

MongoDB模式設計/加入Monogo DB

[英]MongoDB schema design/join in monogo db

我是MongoDB的新手,具有豐富的SQL背景並且不知道設計以下方案的理想方法是什么:

我有一組將ping發送到主機的機器,並且我需要知道最近10分鍾內哪些機器發送了ping。

我有2個收藏夾:

  1. pings一個非常大的集合,每台機器大約每10分鍾發送一次ping。
  2. machines -數量很少,大約不到1000台機器

並且我需要查詢“ Alive”計算機,即最近10分鍾內發送ping的所有計算機。

目前,我的架構如下所示:

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

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

MongoDB中的數據建模與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上有一個索引,它將閃電般快速,僅涉及一個集合。 並且即使您更改了計算機名稱,與檢查這些計算機的up-state(?)相比,這也應該是一個非常罕見的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM