2016-11-15 7 views
1

Azure DocumentDbの新機能で、コレクション内のデータをモデル化する最良の方法について質問があります。コレクションでは、すべてのドキュメントが同じスキーマを持つ必要はありません。非常に単純な例では、教師と学生に関する文書を含む学校のコレクションがあるとします。 jsonプロパティのいくつかは、例えば 'lastName'のように同じであるかもしれません。私は先生と生徒を区別し、すべての生徒に姓が "スミス"であるようにクエリを実行する必要があります。私の質問は、 "教師"に比べて "学生"である文書を定義する最良の方法は何ですか。私はこのような「タイプ」プロパティを追加する例を見てきました:Azure DocumentDbフラットとネストのモデリング

//Student document 
    { 
     "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4", 
     "lastName": "Smith", 
     "grade": 10, 
     "type": "student" 
    } 

//Teacher document 
    { 
     "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4", 
     "lastName": "Smith", 
     "subjectTaught": "Algebra I", 
     "type": "teacher" 
    } 

その後、あなたは、このような問い合わせができます

SELECT * from c where c.lastName = "Smith" and c.type ="student" 

私もオブジェクト型がネストされている別のアプローチを見てきました

//Student document 
    { 
     "student": { 
     "lastName": "Smith", 
     "grade": 10 
     }, 
     "id": "7d2c5595-21b1-4598-8a70-196a3feeeab0" 
    } 

//Teacher document 
{ 
    "teacher": { 
    "lastName": "Smith", 
    "subjectTaught": "Algebra I", 
    }, 
    "id": "7d2c5595-21b1-4598-8a70-196a3feeeab0" 
} 

次に、あなたのクエリは次のようになります。

SELECT c.student from c where c.student.lastName = "Smith" 

データモデリングのベストプラクティスの観点からは、どちらのアプローチが優れているのが好奇妙です。明らかに、これは非常に単純な例であり、現実世界のコレクションはより複雑な文書を持つでしょう。

+0

モデルには「最良の」方法はありません。それはあなたのアプリのニーズとクエリパターンに依存します。 –

答えて

2

最初の例(typeフィールドを使用)が最も一般的であり、エンティティフレームワークのいくつかがこれをサポートしています。

しかし、いくつかのパフォーマンステストを行い、別のisStudentフィールドとisTeacherフィールドがブール値であり、常に真であるかフィールドがないことが若干良いことがわかりました。だから、あなたの例を使用して:私は、誰もがそれをあなたの第二の方法を行う見られなかったり、パフォーマンスに試してみました、それを分析するが、私の推測では、それが持っているということです決してまし

SELECT * from c where c.lastName = "Smith" and c.isStudent 

//Student document 
    { 
     "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4", 
     "lastName": "Smith", 
     "grade": 10, 
     "isStudent": true 
    } 

//Teacher document 
    { 
     "id": "035cbc59-76ba-4255-9abf-fa57cdcf81f4", 
     "lastName": "Smith", 
     "subjectTaught": "Algebra I", 
     "isTeacher": true 
    } 

は、その後に問い合わせます私が上でお勧めするものと同様の性能特性。

私は、いくつかの実験を行うことをお勧めします。違いが最小限の場合は、あなたと開発者に最も合ったものを選んでください。

+0

あなたの2番目の選択肢には当てはまらない、私の推奨する方法に行く理由の1つは、私がミックスインを可能にするということです。学生と教師の両方に適用できる「isOnAVisa」というステータスがあるとします。あなたは、そのビザの詳細を書いたドキュメントにいくつかのフィールドを追加することができ、フラグ 'isOnAVisa = true'を追加することができます。次に、学生か教師かにかかわらず、ビザを取得したすべての人のデータベースを照会することができます。 –

関連する問題