2011-11-30 23 views
8

私はJAVAベースのWebアプリケーションを開発しています。主な目的は、複数のウェブサイトで販売されている商品の在庫をチャンネルと呼ぶことです。私たちはこれらすべてのチャンネルのマネージャーとして行動します。 必要なものは次のとおりです。SQLと在庫管理システム用のNoSQL

  1. 各チャネルの在庫更新を管理するキュー。
  2. 各チャネルで割り当てのスナップショットが正しいインベントリテーブル。
  3. セッションIDとその他の高速アクセスデータをキャッシュに保持する。
  4. ダッシュボード(XMPP)のようなfacebookを提供することで、売り手はできるだけ早く更新されます。

私が見ているソリューションは、同期レプリケーションモードではPostgres(現在は同期レプリケーションモードまで)、Cassandra、Redis、CouchDB、MongoDBなどのNoSQLソリューションです。

私の制約は以下のとおりです。

  1. 在庫更新が失われることはできません。
  2. ジョブキューは順序どおりに実行する必要があります。
  3. 簡単/迅速な開発と将来のメンテナンス。

私は任意の提案に開放されています。前もって感謝します。

答えて

3

NoSQLはこのアプリケーションでは正しくありません。

これは確かに使うことができますが、多くのSQLがあなたのために提供しているものを再実装することになります。たとえば、私はそこにたくさんの関係を見ています。また、ACIDが必要です(ただし、NoSQLソリューションの中にはそれがあります)。

リレーショナル・データをリレーショナル・データベースに保管し、非リレーショナル・データをキー/値ストアに保管することはできません。あなたの制約に対処

+0

thats私は今(リレーショナル+ nosql)に傾いているが、どこに境界を配置するのですか?私のリレーショナル・ビジネス・ロジックのいくつかをNoSQLドメインに移行して、スケーラビリティを組み込むことはできますか?私は開発モードになっているので、変更はその価値がある場合に受け入れることができるものです。 – gladiator

+0

待ち時間 - スケーラビリティのためNoSQLを試していますか?それはそれを使う間違った理由です! SQLとNoSQLの両方をスケールすることができます。 SQLからNoSQLへの移行は非常に困難です。逆は簡単です。 – Ariel

+0

それは技術ではない、それは機能です:巨大なテーブルで複雑な結合を実行しようとするなら、それは十分に速くはありません。この仕事をするための銀色の弾丸はありません。 – mnemosyn

4

  1. ほとんどのNoSQLソリューションは、あなたのパフォーマンス対一貫性の構成可能なトレードオフを与えます。たとえば、MongoDBでは、書き込みの耐久性を判断できます。必要に応じて、すべてのレプリカセットサーバーで書き込みを強制的にfsyncすることができます。他の極端な場合には、コマンドを送信することもできますが、サーバーの応答を待つことさえありません。

  2. ジョブキューを順番に実行することは、アプリケーションコードの問題のようです。私は、データベースのタイムスタンプとorder byクエリのタイプは、ほとんどのアプリケーションのために行う必要がありますと言うだろう。複数のアプリケーションサーバーがあり、キューが完璧である必要がある場合は、注文を提供するtruly distributed algorithmを使用する必要がありますが、これは一般的な要件ではなく、実際は非常に難しいです。

  3. これまでMongoDBを使用してきましたが、これによりアプリの開発スピードが大幅に向上すると確信しています。メンテナンスに大きな違いはなく、データの維持はいずれの場合でも苦痛です。スキーマを持たないため、柔軟性が増します(遅延移行)が、より精巧で、注意が必要です。

要約すると、私は両方の方法で行うことができます。NoSQLはより多くのコード駆動型であり、トランザクションとリレーショナルの整合性は主にコードによって管理されます。あなたがそれに不快ならば、リレーショナルDBに行ってください。あなたはデータが巨大に成長している場合

しかし、あなたはおそらく、10B行のデータベースに参加するリアルタイムを行うにはしたくないので、手動でこのロジックの一部をコーディングする必要があります。それでも、SQLで実装することはできます。

異なるデータベースのための境界を見つけるための良い方法は、あなたがキャッシュできるかを検討することです。大きなリスクがないので、いつでもキャッシュして再構築できるデータは新しいレイヤの導入を開始するのに最適です。また、キャッシュされたデータは通常、関係を保持しないので、ここで一貫性を犠牲にしません。

9
  1. 各チャネルの在庫更新を管理するキュー。

これは必ずしもデータベースの問題ではありません。あなたは(例えば。RabbitMQの)各チャネルの割り当ての正確なスナップショットを持っている

  1. Inventoryテーブルメッセージングシステムを見たほうが良いかもしれません。
  2. セッションIDとその他の高速アクセスデータをキャッシュに保持する。

セッションデータは、おそらく(など、Redisの、例えばmemcachedの)複数のタスクに適した別のデータベースに配置する必要があります

    DB

    何フリーサイズありません
  1. ダッシュボード(XMPP)のようなfacebookを提供して、売り手をできるだけ早く更新し続ける。

私の制約は、 です。1.インベントリの更新は失われません。お使いのアプリケーションによって

  1. この機能を提供する必要があります。

は、この質問に答えるための3つの方法があります。データベースは、不良レコードが拒否され、ロールバックされることを保証できますが、すべてのクエリが入力されることを保証するものではありません。 エラーが発生したときにアプリケーションを認識し、もう一度やり直す必要があります。メモリ内

  • いくつかのDBストアのレコードと、ディスクへのフラッシュメモリperidocally、これが停電した場合のデータの損失につながる可能性があります。 CouchDBは常にレコードに追加されます(たとえ削除がレコードに追加されたフラグなので、データの損失は非常に困難です))

  • 一部のデータベースは極端に設計されています地震、ハリケーンなどの自然災害が発生した場合でも、耐久性があります。

  • あなたが参照している耐久性のタイプはどれですか?

    1. ジョブキューは順番に実行する必要がありますが、決して失われることはありません。

    ほとんどのSQLソリューションでは、並列実行が優先されます。ここには2つのオプションがあります。 1.使用のすべてのクエリのために、テーブル全体をロックDB(遅い) 2.賢くやイベント化(クライアント側シーケンシャルキューイング)

    1. 簡単/迅速な開発と今後のメンテナンスするアプリケーションを構築します。

    一般的に、あなたは、SQLが最初に開発するより高速であることがわかりますが、変更はNoSQLのはもう少し計画を必要とするかもしれ 実装が困難になることができますが、アドホッククエリやスキーマ変更を行うことが容易です。

    あなたはおそらく自問する必要がある質問は、より多くのようです:

    1. は、「私はマップ/削減がに適していることを強烈なクエリや深い分析を持っている必要がありますか?」

    2. は、「私は頻繁に私の変化に私のスキーマが必要になります?

    3. 」私のデータは非常に関係ありますか? ?どのような方法で「

    4. 『私の選ばれたDBの背後にあるベンダーは、私はそれを必要とするとき、私を助けるために十分な経験を持っているのですか?』

    5. は、」私は、そのような地理空間のインデックス付け、全文検索などの特別な機能が必要になります等」?

    6. 「私のデータがどれくらいリアルタイムに近いでしょうか? 1秒後まで私のクエリに最新のレコードが表示されていないと怪我をしますか?許容レイテンシーのどのレベルですか?「

    7. 『私は本当にフェイルオーバーの面で何が必要なのか』

    8. 」私のデータの大きさとは?それは記憶に収まるでしょうか?それは1台のコンピュータに収まるでしょうか?個々のレコードは大小ですか?

    9. 「データはどのくらいの頻度で変更されますか?これはアーカイブですか?」

    独自のインベントリスキーマを持つ複数の顧客(チャネル?)を持つ場合、ドキュメントベースのDBには利点があります。私は在庫を持つeコマースシステムを見て、それはほぼ235のテーブルを持っていた1回覚えています! また、特定のリレーショナルデータがある場合は、SQLソリューションにもいくつかの利点があります。

    mongo、couch、riak、またはorientdbを使用して、指定された制約を使ってソリューションを構築する方法を確かに確認できます。しかし、どれが最高ですか?私は直接DBベンダーと話してみると、おそらくnosqlテープを見てください

    関連する問題