RavendBのようなドキュメントデータベースでデータの複製を避けるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2968193

  •  24-10-2019
  •  | 
  •  

質問

RavendBなどのドキュメントデータベースは非関連性であることを考えると、複数のドキュメントに共通するデータの複製を避けるにはどうすればよいですか?データを複製しても問題ない場合、どのようにそのデータを維持しますか?

役に立ちましたか?

解決

ドキュメントデータベースを使用すると、データをある程度複製する必要があります。その程度は、システムとユースケースに依存します。

たとえば、簡単なブログとユーザーの集計がある場合、次のように設定できます。

  public class User 
  {
    public string Id { get; set; }
    public string Name  { get; set; }
    public string Username  { get; set; }
    public string Password  { get; set; }
  }

  public class Blog
  {
     public string Id  { get; set; }
     public string Title  { get; set; }

     public class BlogUser
     {
       public string Id  { get; set; }
       public string Name  { get; set; }
     }
  }

この例では、ブログに関連付けられているユーザー集計のIDと名前のプロパティを使用して、ブログクラス内にブログのクラスをネストしました。ブログクラスが関心を持っている唯一のフィールドであるため、これらのフィールドを含めました。ブログが表示されているときにユーザーのユーザー名またはパスワードを知る必要はありません。

これらのネストされたクラスはシステムのユースケースに依存するため、慎重に設計する必要がありますが、一般的なアイデアは、データベースから単一の読み取りでロードできる集計を試して設計することです。それらを表示または操作します。

これにより、user.nameが更新されたときに何が起こるかという問題が発生します。

ほとんどのドキュメントデータベースを使用すると、更新されたユーザーに属するブログのすべてのインスタンスをロードし、blog.bloguser.nameフィールドを更新し、それらをすべてデータベースに保存する必要があります。

Ravenは更新のために機能をサポートするため、わずかに異なります。そのため、RavendBに対して単一のアップデートを実行することができます。これにより、ブログの[ユーザーブログのプロパティもロードして個別に更新する必要があります。

すべてのブログのRavendB(マニュアルの方法)内で更新を行うためのコードは次のとおりです。

  public void UpdateBlogUser(User user)
  {
    var blogs = session.Query<Blog>("blogsByUserId")
                  .Where(b.BlogUser.Id == user.Id)
                  .ToList();

    foreach(var blog in blogs)
       blog.BlogUser.Name == user.Name;

    session.SaveChanges()
  }

SaveChangesを例として追加しました。 RavendBクライアントは作業パターンの単位を使用しているため、これは実際にこの方法以外の場所で発生するはずです。

他のヒント

私見に対するあなたの質問に対する「正しい」答えはありません。それは、あなたが複製しているデータがどれだけ可変性があるかに本当に依存します。

を見てください RavendBドキュメント ドキュメントDBの設計とリレーショナルに関する多くの回答について ドキュメント構造の設計上の考慮事項 資料。要するに、ドキュメントDBは、文書に共有データを埋めたくない場合、IDによる参照の概念を使用します。これらのIDはFKSのようなものではなく、完全にアプリケーションに依存しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top