我在這裡主要是想請教Mongoid的設計思路,這也是我很煩惱的一個地方。首先有兩個內嵌相關的Model:
class User
include Mongoid::Document
embeds_one :homepage
end
class Homepage
include Mongoid::Document
embedded_in :user
end
程式碼很簡單,為了闡述方便。在這裡,User與Homepage是典型的一對一關係。如果放在關係型資料庫裡,需要在Homepage裡作一個外鍵映射。 Mongo很靈活,可以把Homepage直接內嵌到User中去。我們很容易對User進行查詢,例如User.all
;可是我把相同的語法放到Homepage.all
中去,卻不起任何作用。
不要說什麼Mongodb中只能對集合進行操作,User是集合,Homepage不是集合之類的;這裡是Mongoid,不是Mongodb,完全可以實現Homepage的概念。何況,Homepage也有一個id屬性,如果不把它抽象成獨立的集合來看,增加的那個id不就很雞肋嗎?
我糾結於此,不只是因為我可以把embeds_one關係換成has_one。事實上我就是需要這樣的語意。我會為User設計一套接口,例如/users
;同樣會針對Homepage設計一套接口,例如/homepages
。但是,這樣的話就會失去一個重要的體驗,那就是根據Homepage的內容篩選User;更進一步的,我不能同時根據Homepage和User的內容篩選篩選User(也就是關係型資料庫的join操作)。
希望與各位同僚討論,謝謝大家的支持。