この質問は、NoSQL データベースの「適切な」タイプを選択することに関するものです。特定のタイプと、それらが適合する理由についても説明していただければ幸いです。現在使用されている従来の RDBMS ソリューションとともに、以下にリストするいくつかの要件/ユース ケースに従ってください。場所。少し長くなりますが、このトピックに関する議論は、新しいパラダイムを学ぼうとしている人々にとって本当に有益であると思います. NoSQL については多くの議論がありますが、私が見たところ、それらのほとんどは高レベルであり、初心者には十分な洞察が得られません。
だから、ここに来ます:
私は、プログラミングのキャリアのほとんど (15 年) の間、従来の RDBMS/SQL システムに対して開発を行ってきており、その経験は豊富です。最近、NoSQL とその有用性について大きな話題になっています。私が説明するシステムは、私が見た平均的な TODO や Calender の例よりも少し複雑であるため、適切な議論を行うことができます。
このシステムは、比較的複雑なセルラー ネットワークに関連しています。このようなネットワークには、約 300 の「クラス」があります (「完全展開」では、複数のネットワークを一緒に持つことができ、最大 1000 以上のクラスに成長する可能性があります)。 100,000 ~ 10 秒)。これは、システムを駆動するためにデータベースに毎日 (時には 1 日に数回) ロードされます。クラス間の関係は、包含または「使用」のいずれかです。ドメインは比較的急速に変化しています (ネットワークのソフトウェア更新の間隔は約 3 か月です。通常、それぞれの更新は、既存のクラスにパラメーターを追加し、いくつか (10 ~ 20) の新しいクラスを追加することを意味します)。
システムの使用法 (ユース ケース) は次のとおりです。
- プロパティの表示 (「ids in () のテーブル 1 からフィールド 1、フィールド 2 を選択」など) およびテーブル形式での表示
- 変更の追跡 (今日と昨日の間の変更 - 値が変更され、インスタンスが追加/削除されたパラメーター
- ビジネスルールの確認:
- シンプルにすることができます (SELECT idField1...idFieldN, paramValue FROM table where paramValue<>default"
- またはより複雑 - 関係のチェック - たとえば、タイプ x の子の数など
- クラスのすべての階層を取得 - 特定のクラス インスタンス、その子、場合によってはインスタンスまたはその子によって使用されるクラスを選択します
- クラスインスタンスに変更を加え、ネットワークにプッシュバックします(実際に実行されたことを確認します-変更の検証)。これには、通常、クラスの階層に基づいて 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)
ここまで読んでくれたなら、とても感謝しています。また、参加したいと思うなら、なおさらです ;-)