Php 使用关系数据库构建GitHub风格的时间线的设计模式?
是否有一种设计模式用于构建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
[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();
}
相关问题
以下是一些关于该主题的大量信息的帖子:
NotifiableInterface
@vfragosp的示例,这是在你回答了两年之后,希望你做得很好:)如果删除评论,我如何记录活动?或者如果有人不喜欢他们以前喜欢的东西?有什么想法吗?@Sahan,有三种可能的方法:1。您可以覆盖modeldelete
方法,并删除该类型和id组合的所有通知。2。您可以钩住模型的delete事件并在那里执行。3.您可以创建一个服务类,如CommentingService
,用于管理所有内容的创建和删除。因此,您不必执行$comment->delete()
而是执行$commentingService->deleteById($id)
或类似操作。后者作为长期解决方案要好得多,因为它更容易注入依赖项、测试和重构。@vFragoSP-解决方案的一个问题是它没有跟踪动词。-“已创建、已回答、已完成”等可能需要再添加一列。