2014-01-22 82 views
0

該場景如下。RavenDB中的數據建模

該模型有一個公司。一家公司可以有很多用戶。用戶使用其特定的電子郵件和密碼進行登錄。

我應該只是與公司內的用戶文件。如果是這樣,我如何查詢用戶? 或者,我應該爲每個用戶製作一個單獨的文檔。除了登錄憑證外,他們的資產非常少,因爲主要數據與公司掛鉤。 什麼時候將它分解成單獨的文檔是有意義的?

一般來說,網絡中關於實際數據模型建模考慮的信息似乎很少。將很高興的任何鏈接到這篇文章或視頻。

回答

0

簡短的回答是 - 它依賴。取決於用例,要執行的查詢類型,文檔大小等。

我最可能爲每個用戶都有一個文檔,每個公司都有一個文檔,然後在它們之間使用文檔引用 - RavenDB是一個簡單的字符串屬性,它將保存您引用的其他文檔的ID。

問題是 - 哪個文件應該引用哪個?用戶文檔引用公司還是其他方式?

這就是答案的答案 - 這取決於。

我在我的博客中有一篇文章討論這個問題,使用部分用例可能會對您有所幫助:http://code972.com/blog/2013/12/610-many-to-many-relationships-and-ravendb-models

1

我通常創建3個集:

  • 的UserInfo(ID,CompanyId,全名,頭像......)。 Id創建者: UserInfos- {UserName}

  • LoginIndentity(Id,UserId,ProviderName,Key)。其中id = {前綴} - {}的ProviderName - {}鍵

(即: 「[email protected]」 或 「LoginIndentities Facebook的-56789 ......」)。如果您使用此模式,您可以刪除ProviderName和Key屬性。

  • 公司(ID,姓名,...)

用法:

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