2012-10-02 32 views
0

我和我的團隊都是NoSQL的初學者,他們仍然在一個項目上使用SQL Server 2008實體框架,但隨着時間的推移,項目變得越來越大,比EF更復雜我們決定採用MongoDB,但由於巨大的範式轉變,我們仍然有很多疑問,我會在這裏發佈它們以瞭解您的想法和您的意見。如何使用NoSQL進行數據建模

我有實體「Person Fisica」,「Patient」和「professional」,患者和Professional是Person,但在一些時刻患者和專業人員將是同一個人ex(專業醫療單位這也是耐心的)在SQL Server中,我們有一位患者參考了自然人和專業人員,他也提到了患者和專業人員是同一個人時,他們提到了同一個人,現在在蒙哥出現了疑問,這裏的一些團隊成員想要做同樣的事情,病人和專業組織有人的身份證。現在我想讓病人和專業人員有充分的對象,但是哦,這個完整性怎麼樣?因爲從技術上講,患者的自然人與專業人士的身體是不同的......這個問題和其他問題在這裏突破了我們的頭,在共享的幾個實體中不知道我們是否將實體放在具有它的對象內或者對象只採用實體的Id,與關係DB中的方式相同。另一個例子:健康單位和UnidadeDeSaude的類型,一種健康單位有多個健康單位和一個健康單位有一個類型,正確的方法是將單位類型對象放置在健康單位內或者僅通過標識引用它?

Google搜索了幾篇文章,但我們仍然懷疑在這些情況下 http://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/ http://blog.fiesta.cc/post/11319522700/walkthrough-mongodb-data-modeling

回答

1

如果不能清楚地看到你所擁有的,所以一般來說,在MongoDB中你不會加入表與RDBMS一樣。通常,如果您有一個Person實體,則將整個Person存儲爲Person。這是你的代碼類的一個很好的映射。

如果您有其他實體的引用,比如在Patient和Professional之間共享一個Person,您可以在RDBMS中使用外鍵引用。你可以用Mongo來做,但Mongo不會爲你做JOIN。這將由調用者完成。推薦的方法是將Person實體的副本放入Patient和Professional中。這意味着如果你更新Person實體,你現在必須在兩個地方更新數據,但這並不一定像聽起來那麼糟糕。通常更新「快速」,你可以更新'自動',所以在實踐中,與更新單個實體幾乎沒有什麼區別,只是你不必做JOIN,所以你的讀取更簡單,通常更快。

您用於獲取數據的最強大的工具是集合(表格)索引在您的文檔(實體)上,並且您可以利用這些索引將是返回數據的最快方式。因此,直截了當地說,如果您需要更頻繁地過濾和處理文檔的某些部分,那麼最好將其分解成共享索引鍵的實體。這意味着將Person,Patient和Professional存儲在同一個集合中並使用兩個密鑰。一個關鍵是Person和它的派生類(Patient)共享的,另一個是類型鑑別器,它選擇一個或另一個部分。換句話說,使用索引來查找整個實體或整個實體的集合。

除此之外,如果您已經使用索引來查找實體Person,Patient或Professional,請閱讀整個實體,並讓它包含在沒有JOIN的情況下完成請求所需的所有內容。因此,無論您要求患者還是患者(均指同一人),您都會獲得與您閱讀的對象相同的人員數據。

簡而言之,您將在Mongo中複製數據,這些數據就是您在SQL中使用Join的任何地方。

你能繪製你的類層次結構的樣子嗎?

+0

下面是我的模型的一點:https://gist.github.com/3823206 –

+1

好的,所以Professional和Patient不是從PhysicalPerson派生的,而是包含一個。與您在ORM中所做的不同,在Mongo中,您只需序列化Patient,包括直接嵌入的Person對象,假設您想在一個操作中讀取整個Patient。記得做一個JOIN,這將是兩個操作。但是,如果要分別對Person對象進行操作,那麼它們會更好地作爲集合中單獨的頂級實體。事實上,你可以同時做兩件事,這取決於最適合你的查詢。 – cirrus

+0

謝謝@cirrus,爲我和我的團隊澄清了很多事情! –

相關問題