2010-05-06 35 views
1

我目前正在嘗試學習Ruby On Rails,因爲我是一位長期的PHP開發人員,所以我正在構建我自己的社區,如頁面。在Ruby On Rails和Mongomapper插件中使用MongoDB

我已經走得很遠,並且已經制作了使用MySQL的用戶模型等。

但是後來我聽說MongoDB並且對它進行了一些修改,我發現它很好。

所以我設置了它,我使用mongomapper來連接rails和MongoDB。

我現在將它用於網站上的新聞頁面。

我還爲每個用戶提供了一個配置文件頁面,其中包含他們自己的留言簿,以便其他用戶可以訪問他們的個人資料並向他們寫入一些信息。

我現在的想法是改變使用MySQL的用戶模型開始使用MongoDB。

我可以從顯示每個用戶模型的設置開始。

用戶模型:

class User < ActiveRecord::Base 
      has_one :guestbook, :class_name => "User::Guestbook" 

的留言模型模型:

class User::Guestbook < ActiveRecord::Base 
    belongs_to :user 
    has_many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id" 

然後留言本帖型號:

class User::Guestbook::Posts < ActiveRecord::Base 
    belongs_to :guestbook, :class_name => "User::Guestbook" 

我已經分成像這樣爲我自己方便,但現在當我要嘗試遷移到MongoDB我不知道如何製作表格。

我想爲每個用戶都有一張表,並且在這個表中列出了自從MongoDB擁有EmbeddedDocument以來的所有留言條目的「列」。我想這樣做,所以我只爲每個用戶提供一張桌子,而不是現在當我有三張桌子只是爲了能夠留言。

所以我的想法是有這樣的:

用戶模型:

class User 
    include MongoMapper::Document 
    one :guestbook, :class_name => "User::Guestbook" 

的留言模型模型:

class User::Guestbook 
    include MongoMapper::EmbeddedDocument 
    belongs_to :user 
    many :posts, :class_name => "User::Guestbook::Posts", :foreign_key => "user_id" 

然後留言本帖型號:

class User::Guestbook::Posts 
    include MongoMapper::EmbeddedDocument 
    belongs_to :guestbook, :class_name => "User::Guestbook" 

但是,我可以想到一個問題..當我只是想獲取用戶信息,如暱稱和生日時,那麼它將不得不提取所有用戶的留言板帖子。如果每個用戶在留言簿中都有一千個帖子,那麼這個系統將會獲得很多信息。或者我錯了?

你認爲我應該用其他方式做嗎?

回答

1

不,你沒有,如果你取一個用戶獲取所有的留言簿條目,這是蒙戈查詢和MongoMapper不應該工作這麼多不同的(至於我自己,我使用Mongoid):

db.users.find({_id: '21314'}, {guestbook: 0}) 
       // instead of {guestbook: 1} which would return only the guestbook 

需要注意的是,對於單個文檔,MongoDB仍然有4mb的限制,但應該有成千上萬的留言條目。你也可以將舊版本壓縮成一種檔案。

+0

你可能會寫我mongomapper查詢,因爲我找不到它自己?謝謝! – Lisinge 2010-05-09 17:46:59

+1

是的,文檔,mongomapper的黑暗面。最好的建議是仔細閱讀mongomapper的測試用例,以下是您感興趣的測試用例: http://github.com/jnunemaker/mongomapper/blob/master/test/unit/test_query.rb#L292-294 'User.find('12341',:select => {:guestbook => 0})' – 2010-05-09 18:02:47

+0

是的,我認爲mongomapper很棒,但文檔的缺乏真的讓它失敗。當你提到它時,我已經看了一下Mongoid。它看起來很棒。你會推薦我改用mongomapper嗎? – Lisinge 2010-05-09 18:10:02

1

如果你將有成千上萬的留言條目,那麼做一個單獨的集合可能是一個好主意(正是因爲你已經說過)。

+0

所以我不應該在EmbededDocument中使用它?我應該爲帖子創建一個單獨的表格? – Lisinge 2010-05-06 21:20:06

+0

我不能只使用:select?或者它甚至可以獲取所有的客座博客帖子?也許它只在使用帖子模型時提取帖子? – Lisinge 2010-05-06 22:36:00

+0

我認爲嵌入式文檔在概念上類似於對數據庫進行反規範化:這是一種避免兩個單獨表或集合之間「連接」的方式。 – 2010-05-07 01:39:00