如何同步nosql db(ravendb)中的更改
我已经开始在RavenDB的例子中学习NoSQL了。 我从一个最简单的模型开始,假设我们有由用户创建的主题:
public class Topic { public string Id { get; protected set; } public string Title { get; set; } public string Text { get; set; } public DenormalizedUser User { get; set; } } public class DenormalizedUser { public string Id { get; set; } public string Name { get; set; } } public class User { public string Id { get; protected set; } public string Name { get; set; } public DateTime Birthdate { get; set; } //some other fields }
我们不需要整个User
显示Topic
,所以我将它DenormalizedUser
规范化为DenormalizedUser
,包含Id
和Name
。
那么,这里有一些问题:
1)这种方法对NoSQL是否正确?
2) User
更改Name
时如何处理案例? 我是否需要手动更新非规范化类中的所有Name
字段?
Shaddix您可以使用Raven DB Include函数使用您主题中的UserId加载用户。
var topic = _session.Load(topicId) .Customize(x => x.Include (y => y.UserId)); var user = _session.Load(topic.UserId);
Load for Topic将“预加载”用户,两个Loads只会产生一个GET请求。 (由于我的声誉,我无法直接回复你对Ayende的回复)。
您还可以使用替代(并且可能更清晰).Include()函数而不使用Customize()。
http://docs.ravendb.net/consumer/querying/handling-document-relationships.html
shaddix,你不需要反规范化,你可以保存对id的引用然后包括从服务器加载时
1)是的,这种方法工作正常,结果是,当您想要将主题文档与其用户名一起显示时,您只需要加载主题文档。 然而,正如Ayende所说,性能将几乎与您没有对用户进行非规范化并且在需要时包含它的情况相同。 如果您不担心多服务器部署,我建议采用这种方法。
2)如果您确实想要对用户进行非规范化,那么您可以使用基于集合的操作更新引用此用户的所有主题。 看看这个: http : //ravendb.net/faq/denormalized-updates