120


40

リレーショナルデータベースの代わりにNoSQLデータベースを使用する場合 同じサイトで両方を使用しても大丈夫ですか?

NoSQLデータベースを使用する利点は何ですか? 私は最近それらについて多くを読みましたが、なぜそれを実装したいのか、どのような状況でそれを使用したいのかまだわかりません。

6 Answer


72


リレーショナルデータベースは、http://en.wikipedia.org/wiki/ACID [ACID]を実施します。 したがって、スキーマベースのトランザクション指向のデータストアができます。 実績があり、実世界のアプリケーションの99%に適しています。 リレーショナルデータベースを使用すると、実質的に何でもできます。

ただし、大規模な高可用性データストアに関しては、速度とスケーリングに制限があります。 たとえば、GoogleとAmazonには、テラバイトのデータがビッグデータセンターに保存されています。 RDBMのブロッキング/スキーマ/トランザクションの性質のため、これらのシナリオではクエリと挿入は実行されません。 それが、彼らが独自のデータベース(実際には、キーと値のストア)を実装して、パフォーマンスの大幅な向上とスケーラビリティを実現した理由です。

NoSQLデータベースは長い間使用されてきました-ただ用語は新しいです。 いくつかの例は、グラフ、オブジェクト、列、XMLおよびドキュメントデータベースです。

  • 2番目の質問:*同じサイトで両方を使用しても大丈夫ですか?

何故なの? 両方とも異なる目的を果たしますか?


67


NoSQLソリューションは、通常、リレーショナルデータベースが適していない、使用するのに費用がかかりすぎる(Oracleなど)、またはとにかくデータベースのリレーショナル性を壊す何かを実装する必要があるという問題を解決することを目的としています。

通常、利点は使用法に固有のものですが、RDBMSでデータをモデル化する際に何らかの問題がない限り、NoSQLを選択する理由はわかりません。

私自身はMongoDBとRiakを使用して、RDBMSが実行可能なソリューションではない特定の問題に、MySQL(またはテストにSQLite)を使用する他のすべてのことを行います。

通常、NoSQL dbが必要な場合は、次の理由が考えられます。

  • クライアントは、トラフィックの多いサイトで99.999%の可用性を求めています。

  • SQLでデータが意味をなさない場合、複数のJOINを実行していることに気付く 情報にアクセスするためのクエリ。

  • リレーショナルモデルを壊している場合、保存するCLOBがあります 非正規化データがあり、そのデータを検索する外部インデックスを生成します。

NoSQLソリューションが必要ない場合は、これらのソリューションはRDBMSの代替ではなく、前者が失敗する代替手段であり、さらに重要なことに、比較的新しいため、多くのバグと欠落している機能。

ああ、2番目の質問については、他のテクノロジーと組み合わせて使用​​することはまったく問題ありません。したがって、MongoDBとMySQLが同じマシン上にない限り、MygoDBとMySQLが正常に機能するようになります。


33


Martin Fowlerの優れたhttps://youtu.be/qI_g07C_Q5I?t=44m42s [ビデオ]には、NoSQLデータベースの優れた説明があります。 リンクはそれらを使用する彼の理由に直接行きますが、ビデオ全体には良い情報が含まれています。

  1. 大量のデータがある-特にすべてに適合できない場合 NoSQLはうまく拡張できるように設計されていたため、1台の物理サーバー上で。

  2. Object-relational インピーダンスの不一致-ドメインオブジェクトが関連するデータベーススキーマにうまく適合しません。 NoSQLを使用すると、データをドキュメント(またはグラフ)として保持し、データモデルにより密接にマッピングできます。


12


NoSQLは、データがドキュメント(MongoDB)、キーと値のペア(MemCache、Redis)、グラフ構造フォーム(Neo4J)に編成されるデータベースシステムです。

たぶん、「NoSQLを使用するタイミング」に対する可能な質問と回答があります。

  1. 柔軟なスキーマが必要か、データのようなツリーを扱いますか?
    一般に、アジャイル開発では、すべての要件を事前に知らずにシステムの設計を開始します。開発データベースシステム全体で、頻繁な設計変更に対応し、MVP(最小実行可能製品)を紹介する必要がある場合があります。 または、本質的に動的なデータスキーマを扱っています。 e.g. システムログ、非常に正確な例は、AWSクラウドウォッチログです。

  2. データセットが膨大/大きいですか?
    はいNoSQLデータベースは、データベースがパフォーマンスを犠牲にすることなく何百万、さらには何十億ものレコードを管理する必要があるアプリケーションに適しています。

  3. スケーリングと一貫性のトレードオフ+ RDMSとは異なり、NoSQLデータベースはあちこちで小さなデータを失う可能性があります(注:確率は.x%です)が、パフォーマンスの観点から簡単にスケーリングできます。 例:これは、インスタントメッセージングアプリでオンラインのユーザー、dbのトークン、Webサイトのトラフィック統計のログを保存するのに適しています。

  4. 位置情報操作の実行:MongoDBハッシュの豊富なサポート GeoQueryingおよびGeolocation操作。 MongoDBのこの機能が本当に気に入りました。

一言で言えば、MongoDBは動的な構造化データを大規模に保存できるアプリケーションに最適です。


3


質問に答えるためのいくつかの重要な情報が欠落しています。データベースがカバーできる必要があるユースケースはどれですか? 既存のデータ(https://en.wikipedia.org/wiki/Online_analytical_processing[OLAP])から複雑な分析を実行する必要があるか、アプリケーションで多くのトランザクションを処理できる必要があるか(https://en.wikipedia.org / wiki / Online_transaction_processing [OLTP])? データ構造とは何ですか? それは質問の時間の終わりにはほど遠いです。

私の考えでは、大胆な流行語に基づいてテクノロジーの決定を下すのは間違っています。 NoSQLは、そのスケーラビリティが高く評価されることがよくあります。 ただし、水平スケーリング(複数のノードにわたる)にも価格があり、無料ではないことも知っておく必要があります。 次に、https://en.wikipedia.org/wiki/Eventual_consistency [eventual_consistency [eventual_consistency]などの問題に対処し、データベースレベルで解決できない場合のデータ競合の解決方法を定義する必要があります。 ただし、これはすべての分散データベースシステムに適用されます。

NoSQLで「スキーマレス」という言葉を使用した開発者の喜びも、最初は非常に大きなものです。 この流行語は、テクニカル分析の後にすぐに幻滅します。これは、書くときにスキーマを正しく必要としないが、読むときに作用するからです。 それが、「スキーマon read」である必要がある理由です。 自分の裁量でデータを書きたいと思うかもしれません。 しかし、既存のデータはあるが、アプリケーションの新しいバージョンが異なるスキーマを想定している場合、どうすれば状況に対処できますか?

ドキュメントモデル(たとえば、MongoDBなど)は、http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/ [適切ではない]データモデルです。データ間には多くの関係があります。 結合はアプリケーションレベルで実行する必要がありますが、これは追加の作業であり、データベースが実行すべきことをプログラムする必要がある理由です。

従来のRDBMSが大量のデータを処理できなくなったために、GoogleとAmazonが独自のデータベースを開発したと主張するなら、あなたは言うことができます:あなたはGoogleとAmazonではありません。 これらの企業は先駆者であり、従来のデータベースがもはや適切ではないシナリオの約0.01%ですが、その他の世界ではそうです。

重要ではないこと:https://en.wikipedia.org/wiki/SQL#History[SQL]は40年以上にわたって存在し、何百万時間もの開発がOracleやMicrosoft SQLなどの大規模システムに組み込まれています。 これは、いくつかの新しいデータベースによって実現する必要があります。 MongoDBの人よりもSQL管理者を見つける方が簡単な場合もあります。 メンテナンスと管理の問題に私たちをもたらします。 正確にセクシーではないが、それは技術決定の一部です。


2


RDBMS設計から逸脱する説得力のある根拠を探しているときに、この質問に出会いました。

ジュリアン・ブラウンによる、分散システムの制約に光を当てる素晴らしいhttp://www.julianbrowne.com/article/viewer/brewers-cap-theorem[post]があります。 この概念は、ブリューワーのCAP定理と呼ばれ、要約すると次のようになります。

_ 分散システムの3つの要件は次のとおりです。一貫性、可用性、およびパーティション許容値(略してCAP)。 ただし、一度に2つしか持てません。 _

そして、これは私が自分のためにそれを要約した方法です:

_ 一貫性が犠牲になっている場合は、NoSQLをお勧めします。 _