1

我目前正在尝试学习 Ruby On Rails,因为我是一名长期的 PHP 开发人员,所以我正在建立自己的社区,比如页面。

我已经走了很远,并使用 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"

但后来我可以想到一个问题.. 当我只想获取用户信息(如昵称和生日)时,它必须获取所有用户的留言簿帖子。而且,如果每个用户在留言簿中都有上千个帖子,那么系统将获得非常多的信息。还是我错了?

你认为我应该以其他方式吗?

4

2 回答 2

1

不,如果您获取用户,您不必获取所有留言簿条目,这是 mongo 查询,MongoMapper 的工作方式不应该有太大不同(对于我自己,我使用的是 Mongoid):

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

需要注意的是,MongoDB 的单个文档仍然有 4mb 的限制,但这应该是数以万计的留言簿条目。您不妨将较旧的推送到某种存档中。

于 2010-05-08T22:28:09.730 回答
1

如果您将拥有数千个留言簿条目,那么将其作为一个单独的集合可能是一个好主意(出于您所说的原因)。

于 2010-05-06T20:42:59.233 回答