RavendBのようなドキュメントデータベースでデータの複製を避けるにはどうすればよいですか?
-
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のようなものではなく、完全にアプリケーションに依存しています。