通知表设计?

9

我想为我的社交网络创建一个通知系统,但是在数据库设计上遇到了困难。所以当用户评论另一个用户时,我想显示“X在您的帖子上发表了评论。” 或者当有人关注另一个人时,我想显示通知。

目前我的表格如下:

CREATE TABLE IF NOT EXISTS `notifications` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `notification_id` int(11) NOT NULL,
  `text` text NOT NULL,
  `read` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

我感到困惑的部分是,当有人关注另一个人时,我是否应该插入一条记录?比如说...就在某人点击关注按钮之后?如果是这样,我应该向行中插入什么内容呢?
而且我正在使用PHP和Laravel框架。

你还需要一个“followers”表(多对多关系:id/user_id/follower_id,用户和关注者列上有复合唯一键),这是插入新关注者记录的地方。顺便说一下,“text”字段是多余的,“notification_id”应该改为“comment_id”(如果评论/帖子/...通知发送给各种实体,则还需要一些“comment_type”)。 - shudder
我有一个关注者表。我不知道什么时候插入它? - Akar
当有人点击“关注该用户”时,也许? - shudder
4个回答

20

因为这是一个没有完美解决方案的开放性问题,我建议采用以下结构:

事件表

id    type          text
-----------------------------------------------
1     comment       commented on your post
2     follow        followed you

etc

然后通知表如下所示(我想不到更好的字段名称来传达这个想法):

通知表

id      user_to_notify       user_who_fired_event  event_id    seen_by_user
--------------------------------------------------------------------------- 
 1            12                 13                    2        yes
 2            13                 12                    1        no
 3            1                  15                    1        yes

seen_by_user 可以是布尔值。

使用上述结构的优点是可以回答以下查询,而无需复杂的 SQL 查询:

  1. 用户 X 的帖子上用户 Y 的总评论数。
  2. 用户阅读或点击通知的模式。例如,他可能不会点击关注他的人的通知。
  3. 如果用户已经设置不接收有关某些事件的通知,则可以根据 event_id 进行过滤。

一旦 X 对 Y 的帖子发表评论,您就可以在通知表中输入一个条目,然后在 comments table 中输入评论内容。希望这能在某种程度上帮助您!


1
通知表应该添加一个时间字段,例如,通知消息显示xxxx分钟前。 - Terry Lin
1
虽然你的方法很简单,但是它并不能满足一些使用情况。例如,我们知道会有一个评论表!如果我想在通知表中存储comment_id或post_id等信息该怎么办呢?这在许多情况下非常有用。比如,当我想说“John xx分钟前回复了你的评论'love you man'”,并且我想把它链接到那个评论所在的帖子时。你的方法虽然真的很简单,但它缺少很多必要的功能,而这些功能大多数时候都是需要的。 - Moher
5
@Moher 解决这个问题的一种方法是在通知表中添加一个名为“trigger_id”或“source_id”的列。这将指向触发此事件的帖子/评论/任何事件。 此外,这只是最基本的事情,还需要添加许多列才能使其准备好生产。这个想法是为了给出一个思考的总体方向! - Ymartin

3

我知道我来得很晚,但对于那些仍在寻找的人..我正在构建类似的东西,并且我正在使用它,对我来说运行正常。

    public function up()
{
    Schema::create('notifications', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('user_id'); // set relationship in user model 
        $table->string('user_to_notify'); //the user who will recive this notification
        $table->string('type'); //follow ,comments etc
        $table->string('data'); //follow id ,comment id etc ,you can set relationship in model about this
        $table->integer('read'); 
        $table->timestamps();
    });
}

1

如果您正在使用 Laravel 5.4 或更高版本(我不确定较低版本):

您可以键入 php artisan notifications:table,它将创建一个迁移,其中包含您在 Laravel 通知中需要使用的基本字段。

更多信息请参见 https://laravel.com/docs/5.5/notifications


0
我建议像这样做:
Table person (id, name, etc)

Table post (id, personid, text, etc)

Table comment (id, personid, postid, text, SeenByOP, etc)

SeenByOp 将是一个具有默认值为 0 的位字段。当 OP 查看评论时,该值将更新为 1

我认为不需要通知表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接