3

この質問は、NoSQL データベースの「適切な」タイプを選択することに関するものです。特定のタイプと、それらが適合する理由についても説明していただければ幸いです。現在使用されている従来の RDBMS ソリューションとともに、以下にリストするいくつかの要件/ユース ケースに従ってください。場所。少し長くなりますが、このトピックに関する議論は、新しいパラダイムを学ぼうとしている人々にとって本当に有益であると思います. NoSQL については多くの議論がありますが、私が見たところ、それらのほとんどは高レベルであり、初心者には十分な洞察が得られません。

だから、ここに来ます:

私は、プログラミングのキャリアのほとんど (15 年) の間、従来の RDBMS/SQL システムに対して開発を行ってきており、その経験は豊富です。最近、NoSQL とその有用性について大きな話題になっています。私が説明するシステムは、私が見た平均的な TODO や Calender の例よりも少し複雑であるため、適切な議論を行うことができます。

このシステムは、比較的複雑なセルラー ネットワークに関連しています。このようなネットワークには、約 300 の「クラス」があります (「完全展開」では、複数のネットワークを一緒に持つことができ、最大 1000 以上のクラスに成長する可能性があります)。 100,000 ~ 10 秒)。これは、システムを駆動するためにデータベースに毎日 (時には 1 日に数回) ロードされます。クラス間の関係は、包含または「使用」のいずれかです。ドメインは比較的急速に変化しています (ネットワークのソフトウェア更新の間隔は約 3 か月です。通常、それぞれの更新は、既存のクラスにパラメーターを追加し、いくつか (10 ~ 20) の新しいクラスを追加することを意味します)。

システムの使用法 (ユース ケース) は次のとおりです。

  1. プロパティの表示 (「ids in () のテーブル 1 からフィールド 1、フィールド 2 を選択」など) およびテーブル形式での表示
  2. 変更の追跡 (今日と昨日の間の変更 - 値が変更され、インスタンスが追加/削除されたパラメーター
  3. ビジネスルールの確認:
    • シンプルにすることができます (SELECT idField1...idFieldN, paramValue FROM table where paramValue<>default"
    • またはより複雑 - 関係のチェック - たとえば、タイプ x の子の数など
  4. クラスのすべての階層を取得 - 特定のクラス インスタンス、その子、場合によってはインスタンスまたはその子によって使用されるクラスを選択します
  5. クラスインスタンスに変更を加え、ネットワークにプッシュバックします(実際に実行されたことを確認します-変更の検証)。これには、通常、クラスの階層に基づいて XML ファイルを生成する必要がありました。

RDBMS ソリューションでは、これらの要件を克服するために、データをリレーショナル テーブル (それぞれのクラス) にマップし、メタデータとリレーション ディクショナリを保持しました。さらに、データ取得タスクでは、一般的なデータ コンテナー (クラス タイプ名 + キー値 (または値)) を作成するか、ビューまたはファイルにマージできる DataTable を使用します。

このアーキテクチャ (プラットフォーム) は、アップグレード時にテーブルを更新/作成 (テーブルの変更/作成) し、メタデータと関係を更新するだけでよいことを意味していました。残りのコードは「汎用」であり、メタデータによって駆動されます。唯一の例外は上記の (4) で、ハード コード (データ取得階層に子を追加する) が必要になることがありましたが、最終的にはこのプロセスも一般化しました (階層データ取得 - 親の ID に基づいて子要素を取得するなど)。階層)。

ほとんどの場合、システムはうまく機能しますが、時には遅すぎることもありました (特に 4 では)。遅さはDBからのデータの取得に関連していましたが、一部の展開でのみであり、メンテナンスの不備またはハードウェアの不足に関連している可能性があります(またはプログラミングが悪いのに、なぜ他の展開でうまく機能するのですか?-)

ドメインはネットワークであるため、各インスタンスには個別の名前があり、通常はその階層で構成されていることを追加します (インスタンスとその親、たとえば「Node=ER222,Subrack=3,Slot=5」または「Node=ER222,Equipment」)。 =1,Sector=2,Carrier=C2") であり、各クラスの階層は通常同じです (ただし、一部のクラスは複数の階層に表示される場合があります (たとえば、異なる祖先を持つ))。

通常、システムにはあまり負荷がかかりません。最大で 50 人のアクティブ ユーザーがいる場合もありますが、通常はそれよりもはるかに少なくなります。大規模なネットワークでは、これはおそらく 300 ~ 400 ユーザーまで増加する可能性があります。

現在、同様の要件を持つシステムを開発したいと考えており、NoSQL がどのような利点をもたらすかを検討しています。

  • 動的スキーマまたはスキーマレスの NoSQL は自然な選択であると読みました。
  • グラフデータベースは「ネットワーク」(またはネットワークのようなもの)のモデリングに適していると読んだので、おそらくそれが解決策になる可能性があります(ノード=クラス、エッジ=封じ込めまたは使用法(エッジに属性を持つ))。
  • ドキュメント データベースを使用して、XML を部分的にのみ解析し、階層によってアクセスすることはできますか?
    • 特定のクラスから特定のフィールドを選択するにはどうすればよいですか? そのために恐ろしい XPath クエリを生成する必要がありますか?
  • 多分オブジェクトデータベース?
    • しかし、その後-1000以上のPOCOの(肥大化した)モデルを保持する必要がありますか? シリアル化/逆シリアル化はどれくらい簡単ですか?

上記に加えて、私は .NET テクノロジを使用して開発しているので、誰かが特定のアイデアを持っている場合 - このエコシステムに適合する、または少なくとも .NET で開発できるより良いアイデア (たとえば、REST/THRIFT インターフェイスとそれに対応する .NET API)

ここまで読んでくれたなら、とても感謝しています。また、参加したいと思うなら、なおさらです ;-)

4

2 に答える 2

2

さて、これはここでの私の謙虚な意見ですが、一般的に、RDBMSは、人々が離れるまで当然のことと思っていて、最初に切り替える必要がなかったために切り替えたNoSQL製品を嫌う機能を備えたツールです場所。一般的に、誇大広告に基づいて切り替えることは常に間違いです。また、NoSQLデータベースは一般的にRDBMSに比べて非常に制限されており、特殊化されているため、得ている以上のことを諦める傾向があることにも注意してください。申し訳ありませんが、その通りです。最後に、リレーショナルデータベース管理システムは最適化に優れている傾向があるため、断続的なパフォーマンスの問題を追跡するのは非常に困難ですが、少なくともすべての最適化を自分で行っているわけではありません。

ですから、あなたがNoSQLを除外すべきだと私が主張していると思うかもしれないことをすべて読んだのですが、私はそうではありません。私が言っているのは、あなたはそれについて注意しなければならないということです。NoSQL dbは一般に、非常に小さなニッチ向けに非常によく最適化されているため、汎用タスクではうまく機能しない傾向があります。一方、その最適化により、それらが役立つ場合があります。

リレーショナルデータベースをNoSQLデータベースに置き換える代わりに、NoSQLデータベースの一部を保存/キャッシング/前処理のセカンダリエンジンとして使用して、現在発生している問題の一部を回避できるかどうかが問題になる場合があります。このビューでは、NoSQLデータベースは従来のリレーショナル処理システムの補助として属します。ここでは、リレーショナルデータベースの前処理として、グラフデータベースとドキュメントデータベースの両方を調べます。

于 2012-10-03T07:42:11.563 に答える
1

クリスが言ったように、RBMSの世界で当たり前と思っていることの多くは、NoSQLデータベースにはないことが多いことを覚えておく必要があります。もう1つ覚えておくべきことは、NoSQLは多くのテクノロジーを網羅する非常に広い用語であるため、その意味で質問に焦点が当てられていないということです。

.NETで開発するため、統合が良好なNoSQLデータベースは豊富ではありません。検討できるドキュメントデータベースはRavenDBです。.NETで記述され(インデックスとクエリはLinqとして記述できます)、トランザクションであり(データの更新に関しては、結果整合性がありますが)、ドキュメント指向です(つまりスキーマレス)。

ここでRaveDBでリレーションを処理する方法を確認できますが、クエリのほとんどがグラフトラバーサルである場合は、代わりにグラフデータベースが必要になる場合があることに注意してください。

于 2012-10-03T08:00:27.960 に答える