2011-03-05 66 views
5

我很好奇Grails的MongoDB插件如何處理關係。爲了測試這個我做了兩個域類一個非常簡單的應用:MongoDB,Grails和關係

Author■找兩個領域:String firstNameString lastName

Book■找兩個領域:String titleAuthor author

建立的MongoDB後和Grails我做了一些Author s和Book s,並使用MongoDB交互式shell進行了窺視。我發現,關係的處理方式與在關係數據庫中處理的方式相同:引用其他對象的ID字段。

所以,現在的問題:

  1. 爲了格姆拉這一關,它需要一個單獨的連接來檢索每個文件?
  2. 如果是的話,在PostgreSQL或MySQL這樣的關係型數據庫中這樣做會不會更好?
  3. 如果上述兩個問題的答案確實是'是',那麼是否有更好的方法來管理文檔數據庫(如MongoDB)中的關係?我意識到MongoDB不應該是關係型的,但有些東西我沒有看到如何在沒有重複數據的情況下解決關係(從而導致更新噩夢)。

編輯:我也剛剛注意到,我的作者的'id'屬性沒有正確排序grails。這是否與使用MongoDB有關?在shell中,我可以看到Grails生成的所有文檔的_id屬性的數據類型爲NumberLong

回答

3

我知道MongoDB是不應該的關係,但也有一些事情,我不知道如何解決的關係,而不復制數據

然後不出汗。 MongoDB不是反關係的,它是面向文檔的。

在這種情況下,Books和Authors是兩個頂級對象。嵌套其中任何一個都是不合理的,它們本身都是核心實體。如果每本圖書只有一個作者(N:1),則該圖書包含作者的「引用」是完全合理的。當然你必須做兩個查詢。但是這和做連接查詢有很大的不同嗎?連接查詢仍然需要執行兩個索引查找和兩個數據查找。所以你在這裏沒有花費任何東西。

在每本書支持多個作者(M:N)的情況下,根據您的需要您有several options

我不喜歡想的MongoDB爲「沒有關係」,我認爲這是清潔想到的MongoDB作爲查詢優化

我也剛剛注意到,grails沒有正確排序我的作者的'id'屬性...

我會與Grails的作者直接檢查。聽起來他們可能正在存儲「字符串」而不是實際的ObjectIds(或MongoIDs)。雖然不重要,但這可能是一個錯誤。

1

關於id屬性,文檔現在顯示您可以在您的域類中聲明ObjectId idString id以便不使用使用迭代long的默認GORM實現。只需在班級中聲明該字段,然後該插件將處理其餘的部分。