Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用关系数据库构建GitHub风格的时间线的设计模式?_Php_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

Php 使用关系数据库构建GitHub风格的时间线的设计模式?

Php 使用关系数据库构建GitHub风格的时间线的设计模式?,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,是否有一种设计模式用于构建GitHub启发的时间轴?我正在尝试为我的应用程序编写一个有点复杂和多功能的时间轴系统。它基于这一概念: [Subject] [Verb] [DirectComplement] [IndirectComplement] (metadata: [date]) 因此,在实践中: John created a new post called Beautiful Post (12/01 00:01) John是主语,created是动词,Beauty Post是直接补语 J

是否有一种设计模式用于构建GitHub启发的时间轴?我正在尝试为我的应用程序编写一个有点复杂和多功能的时间轴系统。它基于这一概念:

[Subject] [Verb] [DirectComplement] [IndirectComplement] (metadata: [date])
因此,在实践中:

John created a new post called Beautiful Post (12/01 00:01)
John是主语,created是动词,Beauty Post是直接补语

John commented "OMG" on Beautiful Post  (12/01 00:00)
John是主语,commented是动词,“OMG”是直接补语,Beauty Post是间接补语

John commented "OMG" on Beautiful Post  (12/01 00:00)
我正在使用Symfony2和Doctrine,运行MySQL。我创建了一个名为Timeline的实体,它以字符串的形式存储主题、directcomplete和indirectcomplete的模型以及它们的ID。然后,手动执行适当的查询,以获取每个查询的对象

有没有一种合适的方法可以用Doctrine和MySQL实现这一点?一种更优雅、更通用的方法,它不会让我发疯,也不会强迫我进行大量的查询和讨论?

关于数据库模式 是您想要的社交活动流的标准建议。这里有很多类似的帖子,主要是关于这些活动流的数据库设计(最后的链接)。请不要低估了这本书的阅读量。我相信你会从中学到很多

我建议您使用以下数据库设计:

user|id | INTEGER |通知用户
参与者id |整数|执行操作的用户
活动|类型|字符串|被通知对象的类名/类型
活动| id |整数|被通知对象的id
上下文|类型|字符串|对象父对象的类名/类型
对象父对象的上下文| id |整数| id
读取/查看用户在| DATETIME |看到它时的时间戳
例如,如果有人评论一篇文章,你会有这样的评论:

$notification=array(
'user\u id'=>被通知的用户的$id\u
'actor\u id'=>$comment->user\u id
“活动类型”=>“注释”
“活动标识”=>$comment->id
“上下文类型”=>“帖子”
'context\u id'=>$comment->post\u id
'read_at'=>NULL
);
似乎没有必要拥有所有这些领域,但他们肯定会付出代价

使用该设计,您可以:

  • 按用户、类型或上下文对相关通知进行分组
  • 按操作类型、上下文类型和特定参与者筛选通知(通过联接)
  • 轻松清除已删除对象中的通知(假设用户删除了已发表评论的帖子。其评论的通知应消失)
  • 注意:时间戳(在创建时/更新时)实际上不是必需的。因为您将加载
    活动
    对象(在这种情况下是注释记录),所以您已经有了它的时间戳。复制它们的唯一原因是按时间戳查询“通知”(您将无法在此处使用JOIN)。不管怎样,只要你觉得合适,就可以随意添加它们

    关于学说和符号 我不能对Symfony说太多,但我确信条令支持多态查询。考虑到这一点,它应该很好地配合这种设计

    在Laravel上,我们使用模型实现<代码>NotifiableInterface的方法。通过这种方式,不同的模型可以有自己的逻辑,即谁会得到它的通知,这就是它的上下文

    应用程序本身会监听模型的
    create
    方法,并在合适的时候生成通知,因此模型和控制器本身不必处理通知,它们可以很好地解耦,并且更改存储应该尽可能容易

    应呈报界面示例 这是一个非常简单的
    NotifiableInterface
    示例。你应该把它作为灵感,并根据你的需要加以调整

    interface NotifiableInterface {
    
        // Returns a string representation of the type
        // It may be a get_class($this), the model table
        // or anything you like really.          
        public function get_type();
    
        // Returns an identifier for the object (ie its ID)
        // get_key is for compatibility with Laravel models
        // but you may use get_id.
        public function get_key();
    
        // Returns the context object for this entity.
        // It's advisable that this object also implements
        // NotifiableInterface, so it also has get_type and get_key
        public function get_context();
    
        // Returns the user_ids to be notified.
        // A comment, for instance, should notify the post owner
        // as well as anyone else that commented that post.
        public function should_notify();
    
    }
    
    相关问题 以下是一些关于该主题的大量信息的帖子:


    这个问题并不真正符合SO规则,但这里有一个捆绑的时间线解决方案:不幸的是,它使用了Redis……Redis只是存储选项之一,不是强制性的。你可以用教条来代替。很好的解决方案!您能给我们提供一个NotifiableInterface方法的片段吗?谢谢。当然,我编辑了答案,提供了一个
    NotifiableInterface
    @vfragosp的示例,这是在你回答了两年之后,希望你做得很好:)如果删除评论,我如何记录活动?或者如果有人不喜欢他们以前喜欢的东西?有什么想法吗?@Sahan,有三种可能的方法:1。您可以覆盖model
    delete
    方法,并删除该类型和id组合的所有通知。2。您可以钩住模型的delete事件并在那里执行。3.您可以创建一个服务类,如
    CommentingService
    ,用于管理所有内容的创建和删除。因此,您不必执行
    $comment->delete()
    而是执行
    $commentingService->deleteById($id)
    或类似操作。后者作为长期解决方案要好得多,因为它更容易注入依赖项、测试和重构。@vFragoSP-解决方案的一个问题是它没有跟踪动词。-“已创建、已回答、已完成”等可能需要再添加一列。