数据库 咨询回复提醒数据库设计,SQL 版本

QueXuQ · 2012年09月05日 · 最后由 JeskTop 回复于 2012年09月19日 · 3694 次阅读

我说一下大概的设计原型

User 为用户

Topic 为文章

Reply 为留言

关系分别为:

User has many Topics
User has many Replies
Topic has many Replies

用户想查看当前自己发的文章,可以通过以下查询:

User.Topics   //最近发布的帖子

查看自己的所有留言可以通过一下查询:

User.Replies  //最近回复的帖子

查看自己的某个文章下的所有留言,可以通过以下查询:

User.Topics.Replies  //Home/提醒

但是我看 RubyChina,上提醒是专门用 notifications 处理的,而此站点使用 MongoDB 看不太懂,所以我想问一下这个数据库的设计。 例如 notifications 和以上的关系,而且还如何判断是否为未读贴。notifications 有什么 column?

这个回复提醒功能自己第一次接触,如果有什么参考数据库设计的,可否发个教程呢?谢谢

哥儿们,没有哪位仁兄给个回复呢? 给个相关参考链接也好嘛。 我在百度怎么搜索都搜索不到,可能关键词不对。不过不知道什么样的关键词才好。 google 英语不知道怎么表达。。。

#2 楼 @metal 感激不尽。 关键这个是 MongoDB 的。我想问一下知道不知道 MongoDB 哪里有的像 Migrate 那样,在 shcema.rb 那样可以看到整个数据库的结构呢?

#3 楼 @QueXuQ https://github.com/ruby-china/ruby-china/blob/master/db/schema.rb 表的设计就在这里。mongoid 不用 migration,直接在 models 建字段和表什么的,ruby-china 的 notifications 我很早以前就看过了,水平太低没看明白怎么回事。

#4 楼 @metal 你这个 ruby-china / db / schema.rb 文件,是全部表吗?之前我看过这个文件觉得不对呀,has_many :notifications 都没有,还有很多 table 都没有。 那你现在看懂什么回事没有? 哪个大哥可以解释一下呢,实在搞不懂 mongoDB 啊~ @lgn21st

#5 楼 @QueXuQ 简单的说 mongoid 没有 migration 呀。

mongoid 里表示 mongodb 的表就是 model 的文件名,字段就是

class Notification::Base
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  include Mongoid::BaseModel

  field :read, :default => false   # field就是字段,应该是boolean类型的字段,不知道为什么没有声明:type => Boolean
  belongs_to :user  # 这是表的关系

  index :read => 1  
  index :user_id => 1, :read => 1
end

mongoid 的文档很不错,不需要太好的英文,慢慢看就懂了。http://mongoid.org/en/mongoid/index.html

#6 楼 @metal 哦。就是说 notification 表里只有一个 column 咯,就是 read。 还有两个 index 分别为 read 和 user_id 了?

Mongoid 里面,belongs_to :user 会在保存时候自动加上 :user_id 字段

notification 的字段大概是这样

{
  _id: xxx,
  user_id: xxx,
  read: false,
  _type: xxx, // 'Mention' / 'TopicReply'
  mentionable_id: xxx, // 'Memtion' 消息有这个
  reply_id: xxx // 'TopicReply' 消息有这个
}

如果是用 MySQL,推荐最后两个字段合并成一个 target_id

#8 楼 @Rei 哦。THANKS。 我想问 MongoDB 里,在什么地方看 tables 和 column 会比较详细呢?Model 里总是描述的不详细,需要翻阅若干个 Model 才搞明白~

Mongoid 的字段定义都在 Model 里面,_id 是自带的,belongs_to 会自动加上 xxx_id,继承会加上 _type,然后就是 field 了。

#4 楼 @metal 那个文件是多余的,以前 MySQL 版本的遗漏文件,忘记删除了

#10 楼 @Rei 大哥,根据你的解释,相对都比较清晰了,但是有几个问题搞不懂,不知道可否帮我解决一下呢? mentionable 究竟是做什么用处的?(本来只以为一个 notification 起作用,没想到有蹦出个 mentionable) 还有就是,根据功能实现来说,每当我回复文章的时候,该文章的作者应当收到一个提示“未读信息”,这样说,应该是当我 create reply 的时候,应该运行相关方法,例如创建 reply.notification,之类的运作,可是我看源代码,没有执行什么特别的功能,就是一个数据的存储而已,代码如下:

def create

  @reply = @topic.replies.build(params[:reply])

  @reply.user_id = current_user.id
  if @reply.save
    current_user.read_topic(@topic)
    @msg = t("topics.reply_success")
  else
    @msg = @reply.errors.full_messages.join("<br />")
  end
end

这一点我就摸不着头绪了,是哪里创建了 notification?

#12 楼 @QueXuQ Topic 和 Reply 都可以触发 mention 提醒,那么模型里面 notification 和触发 mention 的对象就关联叫 mentionable 了。

在 Reply 里面有个 after_create 的 callback 发送消息(还用了异步操作)。

#13 楼 @Rei 有 AT 这个功能才需要在 TOPICE 增加 mention 提醒吧。 我现在想一步一步来,不好意思,资质比较差,真心搞不懂 mentionable 是做什么用的?

我写一下我的思路,麻烦你指正一下错误。

我有多少条未读信息,也就是count  notification有多少个false。
一般notification只产生在留言回复上,所以在reply上创建一个callback,每当创建了一个reply,只要不是current_user自己,就生成一个notification,并且将reply_id,user_id对应到当前留言用户和留言信息上。

然后每次查看topic的时候都注意,如果notification为false时候,就把该notification的值设置为true。

然后如果是按照我想象的那样,那 mentionable 究竟是起什么作用的,如果无限制的这样生成 notification,那不就会生成非常多的 notification 了?

这个功能弄了我好久,关键看 rubychina 源代码,太庞大了,摸不着头脑,网上找不到相关思路。

#14 楼 @QueXuQ 有 @ 功能才需要 mentionable,没有就不用管了。

这个我在研究中,不过不知道详细不详细,到时候写上来给大家看看。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号