0

私と私のチームは全員 NoSQL の初心者であり、プロジェクトで Entity Framework と SQL Server 2008 をまだ使用していましたが、時間の経過とともにプロジェクトが大きくなり、EF よりも複雑になり、私たちは解決することにしました。 MongoDB を採用することはできますが、大きなパラダイム シフトのためにまだ多くの疑問があります。ここに投稿して、皆さんの考えや意見を確認してください。

私はエンティティ「Person Fisica」、「Patient」、「professional」を持っており、患者と専門家は人ですが、しばらくすると、患者と専門家は同じ人になります(患者でもある専門の医療ユニット) ) SQL Server では、物理的な人への参照を持っている患者と、人への参照も持っている専門家がいました。患者と専門家が同じ人であった場合、2 人は同じ人への参照を持っていました。ここのチームメンバーはほとんど同じことをしたいと思っています。患者と専門家の組織は個人の ID を持っています。今、私は患者と専門家に完全な対象者を持たせたいと思っていました。しかし、ああ、これの完全性はどうですか?技術的には、患者の物理的人物は専門家の物理的人物とは異なるため...これおよび他の質問はここで私たちの頭を悩ませています。共有されているいくつかのエンティティでは、エンティティをオブジェクト内に配置するかどうかわかりませんまたはオブジェクトは、リレーショナル DB と同じ方法でエンティティの ID のみを取得します。別の例: Health Unit と UnidadeDeSaude のタイプ。Health Unit のタイプには複数の Health Unit があり、Health Unit にはタイプがあります。正しいアプローチは、Unit Type オブジェクトを Health Unit 内に配置するか、単に Id で参照することです。 ? 共有されているいくつかのエンティティでは、リレーショナル DB と同じように、エンティティをオブジェクト内に配置するか、オブジェクトがエンティティの ID のみを取得するかはわかりません。別の例: Health Unit と UnidadeDeSaude のタイプ。Health Unit のタイプには複数の Health Unit があり、Health Unit にはタイプがあります。正しいアプローチは、Unit Type オブジェクトを Health Unit 内に配置するか、単に Id で参照することです。 ? 共有されているいくつかのエンティティでは、リレーショナル DB と同じように、エンティティをオブジェクト内に配置するか、オブジェクトがエンティティの ID のみを取得するかはわかりません。別の例: Health Unit と UnidadeDeSaude のタイプ。Health Unit のタイプには複数の Health Unit があり、Health Unit にはタイプがあります。正しいアプローチは、Unit Type オブジェクトを Health Unit 内に配置するか、単に Id で参照することです。 ?

いくつかの記事をグーグル検索しましたが、これらのケースではまだ疑わしい http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ http://blog.fiesta.cc/post /11319522700/walkthrough-mongodb-data-modeling

4

1 に答える 1

1

自分が持っているものを正確に確認できなければ、一般的に言えば、MongoDBでは、RDBMSの場合と同じようにテーブルを結合することはできません。通常、Personエンティティがある場合は、Person全体をPersonとして保存します。これは、コードクラスからの優れたマッピングです。

他のエンティティへの参照がある場合、たとえば、単一の個人が患者と専門家の間で共有されている場合、RDBMSの外部キー参照を使用してこれを行います。これはMongoで実行できますが、MongoはJOINを実行しません。それは発信者によって行われたでしょう。推奨されるアプローチは、PersonエンティティのコピーをPatientとProfessionalの両方に配置することです。これの影響は、Personエンティティを更新する場合、2つの場所でデータを更新する必要があることを意味しますが、それは必ずしも思ったほど悪くはありません。通常、更新は「迅速」であり、両方を「アトミックに」更新できるため、実際には、JOINを実行する必要がないため、読み取りがより簡単で通常は高速になることを除いて、単一のエンティティの更新とほとんど違いはありません。

データをフェッチするための最も強力なツールは、ドキュメント(エンティティ)に対するコレクション(テーブル)のインデックスであり、データを返すための最速の方法となる活用可能な方法です。したがって、直感に反して、ドキュメント全体よりも頻繁にドキュメントの一部をフィルタリングして処理する必要がある場合は、インデックス付きキーを共有するエンティティにドキュメントを分割することをお勧めします。つまり、Person、Patient、Professionalを同じコレクションに保存し、2つのキーを使用することを意味します。1つのキーはPersonとその派生クラス(Patient)によって共有され、もう1つのキーはどちらかの部分を選択するタイプ識別子です。つまり、インデックスを使用して、エンティティ全体、またはエンティティ全体のコレクションを検索します。

それとは別に、インデックスを使用してエンティティ、Person、Patient、またはProfessionalを見つけたら、エンティティ全体を読み、JOINなしで要求を満たすために必要なすべてのものが含まれているようにします。したがって、PatientまたはPerson(両方とも同じPersonを参照)を要求するかどうかに関係なく、どちらのオブジェクトを読み取っても同じPersonデータを取得します。

つまり、SQLで結合を使用したほぼすべての場所でMongoのデータを複製することになります。

クラス階層がどのように見えるかを描くことができますか?

于 2012-10-02T16:45:51.243 に答える