SQL ServerとMongoを一緒に使用できますか?


14

Webトラフィックが多い、ニュース向けの大きなサイトがあります。アーキテクチャは、よく見られるDB-レポ層-サービス層-Asp.Net MVCです。私たちが見てきた問題は、読み取りパフォーマンスにあります。このDDDドメインオブジェクトはすべて、理論的にはビジネスルールにとっては優れていますが、読み取りパフォーマンスの最適化に関しては困難になっています。

解決策として、まったく新しいもの(私たちにとって)を検討しています。noSQLの使用です。私たちのウェブサイトに表示されるデータにnoSQLデータベースを使用したいと思います。SQL Serverを削除することはできません(少なくともいつでも)が、実際の手順は、Mongoをすべての新しい開発のクエリデータベースとして使用することだと思われます。

私の質問は、SQL Serverをレコードのデータベースとして使用し、Mongoをクエリデータベースとして一緒に使用できるかどうかです。

そのため、エディターの1人がレコードを更新すると、データはSQL Serverに保存されます。これは、一晩で書き直すことができないレガシーコードが多すぎるために必要です。

しかし、Webサイトの閲覧者が記事または記事のリストを表示するとき、Mongo対SQL Serverのパフォーマンスを活用したいと思います。データを多少最新の状態に保つため、たとえば15分以内にSQL Serverデータを更新するには、Mongoを更新する必要があります。RDBMSには、このような操作のためのレプリケーションツールがあり、SQL ServerからMongoに同じことを行う何かがあるかどうか疑問に思っています。Lyncサーバー、おそらく?


3
可能?もちろん、2つの別個のデータストアとして使用できます。ここで正確に何を求めていますか?
オデッド

しかし、それらを一緒に使用できますか?Mongo DBは基本的にデータの読み取り専用キャッシュとして機能しますか?
ジョン

1
繰り返しますが、もちろん「一緒に使用する」ことができます。しかし、それが何を意味するのかは明確ではありません。mongoの何らかの更新メカニズムがある限り、準備は万端です。Udi Dahanの投稿を参照してください-しかし、メカニズムを定義するのはあなた次第です。
Oded

1
MongoDBに移行したことはありませんでしたが、来年はそうなる可能性があります。これまでに行った移行方法の1つは、JSONをvarcharフィールドに格納することです。私が読んだすべてのものから、NoSQLとSQLの間でデータをやり取りする良い方法はありません-特にそこにあるNoSQLデータベースは物事のやり方が大きく異なるため、すべてカスタムにする必要があります。
ジョン14年

1
@Johnは、リレーショナルに固執し、SQL Serverからの移行を希望する場合は、Postgresqlとそのjson統合を確認することをお勧めします。したがって、json列にデータを保存し、データベース内で操作できます。

回答:


13

多くの人が前に抱えている問題に遭遇しました...読み取り用に最適化されたデータベースが書き込み効率に役立つことはほとんどありません。この読み取り/書き込みの障害から発展したアプローチの1つは、CQRS(コマンドクエリの責任分離)です。Wikipediaがリンクしているにもかかわらず、CQRSとCQSは互いに技術的に異なります。CQSは、メソッドが変更(コマンド)を要求するか、情報を要求(クエリ)することの両方を要求することはありません。

CQRSはさらに一歩進んで、クエリとコマンド用に別のモデルがあることを指定します。この単一のステップにより、読み取りデータベースと書き込みデータベースを分離するなどのことが可能になります。これはあなたがやりたいことです。

私がMongoの専門家であるとか、SQL Serverで動作するように構成しているとは言えません。しかし、私の理解では、人々はMongoをトランザクションデータベースの非正規化ビューとして使用しています。トランザクションDBからMongoを更新すると、SQLエージェントを実行することになります。または、データベースをポーリングする別のサービスを持っています。

さらに優れた代替手段は、更新が行われるたびにCommandサービスにイベントを発生させることです。その後、そのイベントをリッスンし、その情報でMongoDBを更新するサービスができます。これがイベントソーシングの基本的なアプローチです(ページでイベントソーシングを検索してください)。

DDDの世界のリーダーの1人であるグレッグヤングは、現在、CQRSに関するFowler Signature Seriesで、Event-Centric(以前はCQRSと呼ばれていました)という本を書いています。ファウラーは彼のブリキにアプローチを説明する投稿を書いています


+1 CQRSはここでうまく適合します。イベントを使用して、ビューの構築に使用されるドキュメントデータベースを作成および更新し、SQLデータベースをそのままにします。
クエンティン・スターリン

CQRSシステムは採用していませんが、グレッグ、ウディなどが書いたことに注意を払っています。CQRSの大部分は特定のプラットフォームではなく、コマンドとクエリを別々に考えるだけです。Microsoft Patterns and Practicesは本をリリースしましたが、Gregが本を書くことになったとは思いません。
ジョン14年

1
私がこの答えに追加する唯一のことは、ユースケースが特にMS SQLとMVCでこれを使用している場合、NoSQL部分についてはMongoDBではなくBrightstarDBを検討しましたか?Entity FrameworkとLINQの互換性があるため、移行が容易になる場合があります。
CrazyPyro

1

はい。現在のプロジェクトでは、データを取得してSQL Serverに保存し、Lucene / Solrを使用して検索インデックスを構築し、MongoDBに保存しています。ただし、MongoDBの設定はカスタムローダーを使用して行われます。SQLServerのレプリケーションや自動更新は行われません。


OK あなたは、同じ制約の下にある持つの両方を使用しますか?
ヤティサガデ11

既存のSQL Serverを一晩で書き換えることはできません。私の考えでは、これは小さくても便利な赤ちゃんの一歩です。
ジョン

@yatisagade:そうです。SQL Serverに対して実行する必要があるレポートがありますが、Luceneインデックスを使用するグローバル検索アプリがあります。
TMN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.