2016-06-21 20 views
2

私はNoSqlを試していますが、探索中に参照データを処理する方法については頭を悩めることはできません。 (私は伝統的なデータベースに慣れていますが、表形式です)教えてください。現在、学生は学校に登録することができ、後で要件を満たすことができます。そこで、学校は学生を探して、どの要件を満たしているかを確認します。NoSqlを参照データに照会する

伝統的なデータベースでは、私は何かをするでしょう。

+---------+ +---------------+ +--------------------+ +---------+ 
| School | | Requirement | | StudentRequirement | | Student | 
+---------+ +---------------+ +--------------------+ +---------+ 
| Id (PK) | | Id (PK)  | | Id (PK)   | | Id (PK) | 
| Name | | Name   | | StudentId (FK)  | | Name | 
+---------+ | SchoolId (FK) | | RequirementId (FK) | +---------+ 
      +---------------+ | HasComply   | 
           +--------------------+ 

私は4つのエンティティを作成し、そしてRequirementStudentに多対多の関係を持っています。だから私は編集または削除するかどうかRequirement私はちょうど中間のテーブルを見ることができます。

のようなフロー何か:私のコード内のどこかに続いて

// EnrollStudentToASchool 
// AssignAllRequirementsToNewStudent 

、新しい要件が、私はMongoDBのを使用していNoSQLの中で、私の場合は、今すぐ

// IfNewRequirement 
// AddNewRequirementToStudent 

を作成された場合、 doc型データストア。私はどこかのデータがインラインであるべきだと読んでいます。以下のような何か:

{ 
    Id: 1, 
    School: 'Top1 Foo School', 
    Requirements: 
    [ 
    { Id: 1, Name: 'Req1' }, 
    { Id: 2, Name: 'Req2' } 
    ], 
    Students: 
    [ 
    { 
     Id: 1, 
     Name: 'Student1', 
     Requirements: 
     [ 
     { Id: 1, Name: 'Req1', HasComply: false }, 
     { Id: 2, Name: 'Req2', HasComply: true }, 
     ] 
    } 
    ] 
}, 
{ 
    Id: 2, 
    School: 'Top1 Bar School', 
    Requirements: [], 
    Students: [] 
} 

私の文書のルートは上記School、同じ流れになります。

// EnrollStudentToASchool 
// AssignAllRequirementsToNewStudent 
// IfNewRequirement 
// AddNewRequirementToStudent 

しかし、たとえば、の場合には、学校がRequirementの名前を編集したり削除することにしましたa Requirement

どうすればよいですか?すべての学生をループし、要件を編集/削除する必要がありますか?あるいは、私はそれをすべて間違ってやっているかもしれない。

お知らせください。

答えて

1

これは素晴らしい使用例です。

この例では、sqlからnoSqlへの変換に関する賛否両論のほとんどが表示されます。

まず提案コレクションのデザインを参照してください。 collection

我々持っている2つのコレクション:schoolstudent理由?私たちはbsonの文書サイズ制限(16MB)について考えなければなりません。そして、良い学校数の学生がそのサイズを超えることができるならば。

なぜ私たちはすべての生徒の記録にデータを複製するのですか?学生の詳細が必要な場合は、学校に行く必要はありません(余分な往復はありません)。

私たちは、学校で履行するための要件の配列(マスターの一種)を持っており、すべての学生が結果とともに独自の配列を持っています。

このようなデータを追加/削除するには、すべての生徒と学校からの反復が必要です。

単純な言葉で言えば、毎日の表示操作=>効率での結合はありませんが、更新はsqlと比べて負荷が少し高くなります。

すべての歓迎!

+0

私はあなたを正しく理解しているかどうか教えてください。あなたは「学校」と「学生」の2つのコレクションを作成しました。余分な往復がないように、学校の詳細を各生徒に埋め込んでください。今度は、「要件」が追加/更新/削除された場合、すべての学生と学校の記録を繰り返す必要があります。正しい?ちなみに、視覚的な関係のために努力を重ねてくれてありがとうございます –

+0

@BoyPasmoはい正しいです!どういたしまして! – profesor79

+0

また、視覚的な表現に気付きました。あなたは 'requirements'を' student'に埋め込みました。余分な往復のためのものですか?あなたがこれをC#クラスで表現するのであれば。 'publicクラスStudent {public int Id {get;セット; }パブリック文字列名{get;セット; }パブリックストリングSchoolName {get;セット; }パブリックICollection <要件>要件{get;セット; }} 'これはデザインの匂いではありませんか?あるいは、ある種の設定やマッピングがあらかじめありますか? –

関連する問題