为每个任务或库api中的每个事务创建函数?

时间:2018-11-01 10:00:51

标签: php mysql api software-design

我正在为我的应用程序中的帖子创建一个库(就像Facebook帖子一样),每个帖子可以具有与其关联的多个标签,并且用户还可以按标签查看帖子,因此我有2个表:-

"posts_has_tags"
    post_id -> tag_id

"tag_has_posts"
    tag_id -> post_id

开发人员可以使用这样的库->

来查询帖子和标签
Post $post = new Post($postId)
Tag $tag = new Tag($tagId)

然后我想添加将标签附加到帖子的函数,但是现在我很困惑,因为我可以创建2个单独的函数,一个将标签添加到post(在post类中),另一个将标签添加到tag(在in中)。标签类)例如:- 首先:-

$post->addTags([$tag1, $tag2])
then 
for (i = 0; i < numOfTags; i++){
    $tag{i}->addPost($post)
}

因此,这里的开发人员(库用户)将具有2个功能,他们将不得不手动添加要发布的标签,还必须将该发布添加至标签,因此,如果第二次操作失败(如果这些表位于单独的计算机上),他们可以回滚首次操作,

我只能在Post类中提供一个函数,该函数将自动完成所有工作,例如:-

$post->addTags([$tag1, $tag2...])

那么哪种方法更好呢?,假设我的数据库是通过函数分片的(平均post_has_tags和tag_has_posts表可以在不同的机器上),那么如果第二台机器失败,则通过第一种方法,库用户可以在应用程序级别创建分布式事务,我们可以通过removeTags()函数回滚第一个操作,在第二种情况下,应该在库级别上完成

我想知道哪个更好?,同样适用于用户关注者,您可以在其中看到关注者和关注者,这些东西也可以在不同的机器上,对不起英语,谢谢:)

1 个答案:

答案 0 :(得分:0)

这通常是用一个表完成的,该表的内容类似于...

table: postAssciatedTags
columns:  postID,
          tagID,
          taggedDate (optional)

具有postID和tagID的主键(因为您只能使用相同的标签对帖子进行一次标记)。

因此,您只添加了一条双向记录,就可以看到某个帖子具有哪些标签,或者哪些帖子被某个标签标记了。