MongoDBがスケーリングできる簡単な例が必要ですが、リレーショナルデータベースで問題が発生します[終了]


8

私はMongoDBの使い方を学んでいるだけで、他のプログラマーと話し合うときに、従来のRDBMSと比較してNoSQLが優れた選択肢である理由の簡単な例が必要です。

たとえば、大量のトラフィックを含むブログは関係的に表すことができますが、パフォーマンスのチューニングとテーブル間の結合が必要になります(完全な非正規化が使用されていると想定)。一方、MongoDBでは、1つのコレクションから直接取得して同じ効果を得ることができます。

しかし、私が他のプログラマーから得ている反応は、「なぜそれをリレーショナルに保ち、後で簡単なキャッシングを追加しないのか」です。

MongoDBが実際に輝き、リレーショナルデータベースがはるかに速くフォールオーバーするという、それほど単純な例はありませんか?プロジェクト/システムが小さければ小さいほど、意見の不一致の余地が少なくなるため、優れています。

ブログの例の複雑さの線に沿った何かが本当に役立つでしょう。

ありがとう。


これは一般的にMongoDBまたはNoSQLに限定されていますか?これがMongoDBにも当てはまるかどうかはわかりませんが、Apache Luceneのファセット検索の良い例があります。
thorstenmüller2013年

一般的にNoSQLだと思います。あなたがすでにいくつかの例を持っているなら、私はそれらを見てみたいです。
Ryan Weir

3
MongoDBはWebスケールです!!!
Wim Ombelets 2013年

1
興味のある(そして少しNSFWの)説明については、mongodb-is-web-scale.comを参照してください。fwiwあなたがそれに近づくなら、あなたは何でもスケールを作ることができます。
Wyatt Barnett

回答:


6

最初に、それはよくスケーリングします。

MongoDBデータベースの頻度が高すぎるか、単一のサーバーに対して大きすぎる場合は、複数のシャードのクラスターまたはレプリカセットを作成することで、サーバーを簡単に追加できます。ほぼ線形にスケーリングします。これは、ほとんどのリレーショナルデータベースではほとんど機能しません。たとえば、クラスターとして機能する場合のMySQLの制限のリストをご覧ください。リストのほとんどのエントリは、MongoDBでは問題ありません(または適用されません)。

第二に、異機種混在のデータを許可します。

たとえば、コンピュータハードウェアストアの製品データベースを想像してみてください。製品にはどのような特性がありますか?すべての製品には価格とベンダーがあります。しかし、CPUにはクロックレートがあり、ハードドライブとRAMチップには容量があり(これらの容量は比較できません)、モニターには解像度があります。リレーショナルデータベースでこれをどのように設計しますか?非常に長いproductID-property-valueテーブルを作成するか、想像できるすべてのプロパティを備えた非常に広くてまばらなproductテーブルを作成しますが、それらのほとんどはNULLほとんどの製品に対応しています。どちらのソリューションも本当にエレガントではありません。しかし、MongoDBを使用すると、コレクション内の各ドキュメントに異なるプロパティセットを設定できるため、これをより適切に解決できます。


5
「第2に、異機種混在データを許可します。」あなたの例は完璧です。エンティティが多くの可能な属性を持っているこのようなシステムで、恐ろしいターンキーからキーバリューストアへのターンパターンが出現したのは誰ですか?すべてのプログラマーはすぐに関係を築くことができなければなりません。
Ryan Weir

5
MongoDBにもいくつかのスケーリングの問題があります。12ノードを超えるクラスタでは、デフォルトのレプリカセットレプリケーションメカニズムを使用できません。マスタースレーブ設定にフォールバックする必要があります。マスター/スレーブレプリケーションには、マスターが失われたときに自動フェイルオーバーが行われないなどの問題があります。一方、Mysqlはクラスター内の数百のノードを処理できます。
ストーンメタル2013年

1
異機種混在のデータを許可することが、MongoDBのスケーリング能力の要因であることは知りません。私はこれがずっと言って一人でそのプロパティが解決しない、あなたはキー/値のストアとしてデータベースを使用している例をたくさん簡素化はないことに同意しますが、なぜ、より良いRDBMSよりもMongoDBのスケール
dsw88

2
申し訳ありませんが、あなたの答え自体には何もありませんでした。この質問のタイトルは、「MongoDBをスケーリングできるが、リレーショナルデータベースに問題が発生する簡単な例が欲しい」です。「いつRSQLでNoSQLを使用するか」という一般的な質問のようには思えません。代わりに、両方のデータベースタイプのスケーリング機能のみを対象としているように見えました。
dsw88 2013年

2
@RyanWeir-同意。NoSQLデータベースはいつ輝きますか?SQL RDBをストレージエンジンとして使用してNoSQLデータベースを構築したことに気づいたとき!
Carson63000 2013年

3

問題のいくつかの実世界の例私は、SQLとリレーショナルデータベースのみを使用して合理的な方法で解決する方法がわからないでしょう(おそらく私の過失)。

したがって、約30,000の製品を含む(一般的なリレーショナル)データベースがあります。今のところ大きなことはありません。これらの各製品には多くの属性があります。グループ(ケーブル、アンテナ、iphoneケース...約80)、品揃え(グループにいくらか似ている:車、ハイファイ、mp3、15のみ)、ブランド(30)などの一般的なものがあります。

次に、技術データが表示されます。各アイテムには、色、ケーブルの長さ、重量、体積などの多くのものがあります。約200のそのような値タイプと数千の値。

そして最も複雑なのは、これらの製品の多くは、ある車種(またはそれらのいくつか)またはある種のモバイルデバイスに属していることです。これらは、ブランド(アップル)モデル(ipad)タイプ(1,2,3,4)のような形式で、場合によっては生成された階層になっています。(車の場合も同様ですが、世代の代わりに年を構築しています)

問題のステップ1:

これらの各属性の商品の量が必要です。赤は何枚ですか?ケーブルグループにはいくつありますか?等々。

これは部分的にSQLで解決できます。それは多くのクエリとかなり醜いでしょうが、私は可能だと思います。遅くなるかもしれませんが、それをもっと醜くして、各テーブルにカウンターを保持し、変更のたびに更新することもできます。製品が複数ある可能性がある属性では特に難しい(iPhoneや他の12の携帯電話で動作するなど)

しかし、ここに問題のステップ2があります。

顧客が1つの属性を選択した場合(たとえば、赤い商品のみを表示したい場合)、すべてのカウンターをリアルタイムで更新します。つまり、非常に複雑なクエリを実行するか(とにかく速度が十分でない可能性があります)、属性の可能な組み合わせ(数十億)のカウンターを保持します。

私がこのプロジェクトを始めたとき、彼らはカウンターオプションを試してみて、属性の非常に小さなサブセット(グループ、品揃え、ブランド)に対してこれを行いました。コードは醜く、バグが多く、遅いものでした。さらに、製品のテーブルよりもはるかに大きいカウンターを備えたテーブルができました。

Apache Solrのファセットを使用することが実際の解決策でした。テーブルをドキュメントのリスト(製品ごとに1つ)にフラット化して、はるかに単純なクエリでリアルタイムでこのすべてのデータを取得できるようにします。


2

EAVテーブルが物事を行うための最良の方法であると考えるときはいつでも考えることができます(現実的なデータベースでは非常に遅く、クエリが難しい)。nosqlデータベースが必要になる場合があります。これは、フィールドがどうなるかを事前に知る方法がない場合に特に当てはまります。例としては、医療検査の詳細の保存があります。新しいテストごとに、格納する必要のあるまったく異なるデータが含まれる場合があります。(理論的には)既存のテストをモデル化することはできますが(数千に及ぶため、多くの時間と労力で)、私たちが持っていないテスト(そしておそらく医療機器)からどのような新しい結果が得られるかをどのようにして知ることができますか?まだ発明されています。


1
これは、連絡先管理ツールのような単純なものでさえ、正当な理由です。誰もが何か違うものを追跡したいと思っています。どの列にText14が使用されているかを知っていれば、大したことではありません。
JeffO 2014

0

プロジェクト/システムが小さければ小さいほど、意見の不一致の余地が少なくなるため、優れています。

NoSQLは大規模環境でのみ優れているため、これは困難です。私はあなたが簡単な例を意味していると思います、そして私はあなたに完璧なものを持っています。

旅行のウェブサイトを作成していて、ユーザーが他の(同じ)5,170の米国の空港のいずれかを宛先とする5,170の米国の空港から旅行する必要があるとします...

しかし、ここにキッカーがあります。すべてのフライトが直行しているわけではありません。ストップオーバーのオプションもすべてユーザーに伝える必要があります。ストップオーバーは2つか3つになることもあります。また、5時間以内にすべてのオプションをユーザーに通知する必要があります。そして、ユーザーが待っている間、これを10秒未満で計算する必要があります。

これは、リレーショナルDBの悪夢です... NoSqlが来ると、通常、飛行ルートは数週間前に石に設定されます。そのため、単純なNoSql DBクラスターよりも、事前にストアですべてのガジリオンの可能性のあるルーティングを計算できます...

NoSqlは、勝者がそのようなシナリオであることは明らかです。


ありがとう、私はその例が大好きで、それを利用します。しかし、あなたが言っていることが「NoSQLは大規模環境でのみ優れている」と本当であるなら、私は開発時間の高速化、スケーリングのより良い将来保証などの側面でより強力な主張をしなければならないでしょう。 ?
Ryan Weir

4
@RyanWeirこれらの質問に対する回答は、アプリケーション固有のものでなければなりません。正直に言うと、NoSqlを学びたいので、チームにNoSqlを販売したいようです。しかし、これは無効な理由であるため、別の方法を考え出そうとしています。「NoSQLを使って学習できるようにしましょう。それは良いスキルです」と彼らに伝えます。
Morons 2013年

1
そもそもなぜこれがデータベースの問題なのですか?このような計算を実行する必要がある場合は、A *のバリアントとして設定し、最初の結果の後で停止しないようにします。データベースからすべての関連するフライトデータをプルし(または既にメモリにキャッシュされている)、ユーザーが設定した優先順位に従って重み付けされたグラフを作成し、最初のX件の結果を報告します。
メイソンウィーラー

@MasonWheelerは、「A *のバリアント」が何を意味するのかわからない
Morons

1
@RyanWeir:本当に、Moronsは正しいです。NoSQLは、大規模な環境でのみ優れています。大規模なもの(つまり、Facebook、Flickr、EBay、Amazonなど)を構築しようとしているのでない限り、ほぼ確実にそれを必要とせず、開発時間のトレードオフは、中程度からリレーショナルモデルが最新のハードウェアで非常に適切に処理する大規模。そのとき、ACIDとリレーショナルモデルがもたらすメリットと保証を本当に理解し始めます。
Mason Wheeler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.