2017-10-28 6 views
0

に参加しますどのマシンが最後の10分間にpingを送信したのかを知る必要があります。MongoDBのスキーマの設計は/私はSQLでの強力なバックグラウンドを持つMongoDBのに新たなんだと次のシナリオを設計するための理想的な方法だか分からないmonogoデシベル

私は2つのコレクションがあります。

  1. pings - 非常に大きなコレクションを、各マシンは、10分毎程度にpingを送信します。
  2. machines - 私は「アライブ」マシンを照会する必要が1000台の未満のマシン

と、最後の10分でのpingを送っすなわち、すべてのマシンについてかなり小さなコレクション、。

現在、私のスキーマは次のようになります。MongoDBの中

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

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

答えて

1

データモデリングは、異なるSQLよりも動作します。 SQLを使用すると、エンティティ、そのプロパティ、およびリレーションシップを識別し、壁面に頭を当ててユースケースから発生する質問に正しい答えを得ることができます。

変化範囲–他のNoSQLデータベースとのMongoDBと–で

、データモデリングは動作が異なります:あなたはあなたのユースケースから最初を発生する質問を識別し、あなたのデータをモデル化応じ質問に答え得ることができるように最も効率的な方法で。

マシンのリストが表示され、マシンの詳細を取得する個々のマシンをクリックする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

Hm ..私はあなたが言っていることを理解しています、それはSQLのすべての正規化の後でそれを考えるのは少し厄介です... sqlからmongoへの "migration"チュートリアルを知っていますか?おそらくSQLで実装されているシナリオとそれがMongoでどのように実装されているのでしょうか? – Michael

関連する問題