我已经开始在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
,其中包含Id
和Name
}。
所以,问题如下:
1)这种方法对NoSQL是否正确?
2)User
更改Name
时如何处理案例?我是否需要手动更新非规范化类中的所有Name
字段?
答案 0 :(得分:3)
shaddix, 您不需要进行非规范化,可以保存对id的引用,然后在从服务器加载时包括它
答案 1 :(得分:3)
Shaddix您可以使用Raven DB Include功能使用您主题中的UserId加载用户。
var topic = _session.Load<Topic>(topicId)
.Customize(x => x.Include<Topic>(y => y.UserId));
var user = _session.Load<User>(topic.UserId);
主题加载将“预加载”用户,两个加载只会产生一个GET请求。 (由于我的声誉,我无法直接回复你对Ayende的回复)。
您还可以使用替代(并且可能更清晰).Include()函数,而不使用Customize()。
http://docs.ravendb.net/consumer/querying/handling-document-relationships.html
答案 2 :(得分:2)
1)是的,这种方法运行正常,结果是,当您想要将主题文档与其用户名一起显示时,您只需要加载主题文档。然而,正如Ayende所说,性能几乎与您没有对用户进行非规范化并且在需要时包含它的情况几乎相同。如果您不担心多服务器部署,我建议采用这种方法。
2)如果您确实想要对用户进行非规范化,那么您可以使用基于集合的操作更新引用此用户的所有主题。看看这个:http://ravendb.net/faq/denormalized-updates