C# RavenDB中的数据建模

C# RavenDB中的数据建模,c#,.net,nosql,ravendb,C#,.net,Nosql,Ravendb,情况如下 模型有一个公司。一个公司可以有很多用户。用户使用其特定的电子邮件和pwd登录 我是否应该有一份里面有用户的公司文件。如果是,我如何查询用户? 或者,我应该为每个用户制作一个单独的文档。除了登录凭证之外,它们只有很少的属性,因为主要数据挂起了公司。 什么时候将其拆分为单独的文档才有意义 一般来说,web上关于真实数据模型建模考虑的信息似乎很少。如果有关于这方面的文章或视频链接,我将非常高兴。我通常创建3个收藏: 用户信息(Id、公司Id、全名、头像…)。Id由创建 UserInfos-

情况如下

模型有一个公司。一个公司可以有很多用户。用户使用其特定的电子邮件和pwd登录

我是否应该有一份里面有用户的公司文件。如果是,我如何查询用户? 或者,我应该为每个用户制作一个单独的文档。除了登录凭证之外,它们只有很少的属性,因为主要数据挂起了公司。 什么时候将其拆分为单独的文档才有意义


一般来说,web上关于真实数据模型建模考虑的信息似乎很少。如果有关于这方面的文章或视频链接,我将非常高兴。

我通常创建3个收藏:

  • 用户信息(Id、公司Id、全名、头像…)。Id由创建 UserInfos-{UserName}

  • 登录身份(Id、用户Id、提供者名称、密钥)。何处Id= {Prefix}-{ProviderName}-{Key}

(即:“登录身份电子邮件-abc@xyz.com或“LoginIdentities-Facebook-56789…”)。如果使用此模式,则可以删除ProviderName和Key属性

  • 公司(身份证、姓名等)
用法:

//Load user by provider name (email, Google, Facebook...) and key
var loginId = GenerateLoginId(providerName,key);
var userLogin = session.Include<LoginIndentity>(x=>x.UserId).Load<LoginIndentity>(loginId);
//RavenDB will create only one query. Cool! 
//http://ravendb.net/docs/2.5/client-api/querying/handling-document-relationships
var user = userLogin==null?null:session.Load<UserInfo>(userLogin.UserId);

//Load User and Company when you know the user name
var userId= GenerateUserId(userName);
var user = session.Include<UserInfo>(x=>x.CompanyId).Load<UserInfo>(userId);
var company = user==null?null: session.Load<Company>(user.CompanyId);
//按提供商名称(电子邮件、谷歌、Facebook…)和密钥加载用户
var loginId=generateLogiId(提供者名称、密钥);
var userLogin=session.Include(x=>x.UserId).Load(loginId);
//RavenDB将只创建一个查询。酷!
//http://ravendb.net/docs/2.5/client-api/querying/handling-document-relationships
var user=userLogin==null?null:session.Load(userLogin.UserId);
//知道用户名时加载用户和公司
var userId=GenerateUserId(用户名);
var user=session.Include(x=>x.CompanyId).Load(userId);
var company=user==null?null:session.Load(user.CompanyId);

简单的答案是——这取决于具体情况。取决于用例、要执行的查询类型、文档大小等

我很可能会为每个用户创建一个文档,为每个公司创建一个文档,然后使用其中一个文档中的文档引用在它们之间建立链接—RavenDB是一个简单的字符串属性,它将保存您正在引用的另一个文档的ID

那么问题是——哪份文件应该引用哪份?将用户文档提交给参考公司还是其他方式

这就是答案所在——视情况而定

我在我的博客中有一篇文章,用部分用例详细讨论了这一点,您可能会发现这很有帮助: