document-database – 如何避免像RavenDB这样的文档数据库中的数
鉴于文档数据库(如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; } } } 在这个例子中,我在Blog类中嵌套了一个BlogUser类,其中包含与Blog关联的User Aggregate的Id和Name属性.我已经包含了这些字段,因为它们是Blog类感兴趣的唯一字段,在显示博客时不需要知道用户的用户名或密码. 这些嵌套类将依赖于您的系统用例,因此您必须仔细设计它们,但一般的想法是尝试设计可以通过单次读取从数据库加载的聚合,它们将包含所需的所有数据显示或操纵它们. 这就导致了User.Name更新时会发生什么的问题. 对于大多数文档数据库,您必须加载属于更新用户的博客的所有实例,并更新Blog.BlogUser.Name字段并将它们全部保存回数据库. Raven略有不同,因为它支持更新的设置功能,因此您可以针对RavenDB运行单个更新,这将更新用户博客的BlogUser.Name属性,而无需您加载它们并单独更新它们. 所有博客的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客户端使用工作单元模式,因此这应该发生在此方法之外的某处. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |