0

私はRavenDBで遊んでいます。とても感銘を受けましたが、子オブジェクトを更新する方法を理解するのに苦労しています。たとえば、次のようなものがあるとします。

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class Student
{
    public Student()
    { 
        Courses = new Collection<Course>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Course> Courses { get; set; }
}

1 人の生徒と、その生徒に関連付けられた 2 つのコースをデータベースに保存できます。問題なく2つのコースを学生にロードすることもできます。しかし、たとえば、student.Courses.Add(new Course { Id = 5, Title = "Accounting 101"}) のようにコースを変更しようとしたとき、データベースにあるものと現在あるものとの間で同期することを期待していました学生。コース。基本的に、データベース内のコースを削除し、student.Courses にのみコースを含めることを期待しています。これは、RavenDB の仕組みについての私の誤解かもしれません。このような例は見つかりませんでした。この状況を処理するベストプラクティスの方法は何ですか?

4

1 に答える 1

1

いいえ、あなたが説明したことは何もしません。モデル化した方法では、データベースには 2 つの別個のドキュメントがあります。

Course
{
  Id : "courses/1",
  Title : "Algebra"
}

Student
{
  Id : "students/1",
  Name : "John",
  Courses :
    [
      {
        Id : "courses/1",
        Title : "Algebra"
      }
    ]
}

非正規化の利点はCourse、コースのタイトルを取得するために情報を確認するときにドキュメントStudentをロードする必要がないことです。CourseStudent

欠点は、変更をCourse両方のドキュメントに対して行う必要があることです。学生ドキュメントにコースを追加しただけでは、Course存在しないドキュメントを参照しています。レイヴンはあなたがそれをするのを止めません。ドキュメント データベースには、参照整合性の制約はありません。

現実の世界では、学生にコースを追加する前にコースを追加することになるでしょう。コースからすべての学生を削除しても、コースがないということにはなりません。実際には、コースの名前を変更するなどのアクションだけが、コースのドキュメントと、関係を持つすべての学生のドキュメントの両方に触れなければなりません。

多くの場合、単に使用したいでしょうIList<string> CourseIds。非正規化する必要はありません。詳細については、このドキュメントを参照してください。

于 2013-01-22T16:13:18.577 に答える