該場景如下。RavenDB中的數據建模
該模型有一個公司。一家公司可以有很多用戶。用戶使用其特定的電子郵件和密碼進行登錄。
我應該只是與公司內的用戶文件。如果是這樣,我如何查詢用戶? 或者,我應該爲每個用戶製作一個單獨的文檔。除了登錄憑證外,他們的資產非常少,因爲主要數據與公司掛鉤。 什麼時候將它分解成單獨的文檔是有意義的?
一般來說,網絡中關於實際數據模型建模考慮的信息似乎很少。將很高興的任何鏈接到這篇文章或視頻。
該場景如下。RavenDB中的數據建模
該模型有一個公司。一家公司可以有很多用戶。用戶使用其特定的電子郵件和密碼進行登錄。
我應該只是與公司內的用戶文件。如果是這樣,我如何查詢用戶? 或者,我應該爲每個用戶製作一個單獨的文檔。除了登錄憑證外,他們的資產非常少,因爲主要數據與公司掛鉤。 什麼時候將它分解成單獨的文檔是有意義的?
一般來說,網絡中關於實際數據模型建模考慮的信息似乎很少。將很高興的任何鏈接到這篇文章或視頻。
簡短的回答是 - 它依賴。取決於用例,要執行的查詢類型,文檔大小等。
我最可能爲每個用戶都有一個文檔,每個公司都有一個文檔,然後在它們之間使用文檔引用 - RavenDB是一個簡單的字符串屬性,它將保存您引用的其他文檔的ID。
問題是 - 哪個文件應該引用哪個?用戶文檔引用公司還是其他方式?
這就是答案的答案 - 這取決於。
我在我的博客中有一篇文章討論這個問題,使用部分用例可能會對您有所幫助:http://code972.com/blog/2013/12/610-many-to-many-relationships-and-ravendb-models
我通常創建3個集:
的UserInfo(ID,CompanyId,全名,頭像......)。 Id創建者: UserInfos- {UserName}
LoginIndentity(Id,UserId,ProviderName,Key)。其中id = {前綴} - {}的ProviderName - {}鍵
(即: 「[email protected]」 或 「LoginIndentities 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);