Ravendb中的数据建模



场景如下。

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

我应该只有一份公司文档,其中包括内部用户。如果是这样,我该如何查询用户?或者,我应该为每个用户提供一个单独的文档。除了登录凭证之外,它们具有很少的属性,因为主要数据悬而未决。将其分为单独的文档何时有意义?

通常,网络中似乎很少有有关真实数据模型建模注意事项的信息。很高兴能链接到有关此文章或视频的任何链接。

我通常创建3个集合:

  • UserInfo(ID,CompanyID,FullName,Avatar ...)。ID由UserInfos- {username}

  • liginIndentity(id,userId,profidername,键)。id ={prefix} - {profidername} - {key}

(即:" loginIndentities-email-abc@xyz.com"或" loginIndentities-facebook-56789 ...")。如果使用此模式,则可以删除ProvidErname和密钥属性。

  • 公司(id,name,...)

用法:

//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);

简短的答案是 - 这取决于。取决于用例,要执行的查询类型,文档尺寸等。

我很可能会为每个用户提供一个文档,每个公司的文档,然后使用其中一个文档引用链接 - 使用Ravendb,其简单的字符串属性将保留其他文档的ID您正在引用。

那时的问题是 - 哪个文件应参考哪个?用户文档参考公司或其他方式?

这是答案所在 - 取决于。

我在博客中有一篇文章,使用部分用例,您可能会发现有用的帖子一定长度:http://code972.com/blog/2013/2013/12/610-many-to-many-to-many-relationshipss - 和ravendB模型

最新更新