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

cclgggtu  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(554)

我正在我的应用程序中创建一个帖子库(就像facebook帖子一样),每个帖子都可以有多个与之关联的标签,用户也可以通过标签查看帖子,所以我有两个表:-

"posts_has_tags"
    post_id -> tag_id

"tag_has_posts"
    tag_id -> post_id

开发人员可以使用这样的库查询post和tag->

Post $post = new Post($postId)
Tag $tag = new Tag($tagId)

然后我想添加将标记附加到post的函数,但现在我很困惑,因为我可以创建两个独立的函数,一个将标记添加到post(在post类中),另一个将post添加到标记(在tag类中),例如:-first:-

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

因此,开发人员(库用户)将有2个函数,他们必须手动将标签添加到post,还必须将post添加到标签,因此如果第二个操作失败(如果这些表在不同的机器上),他们可以回滚第一个操作,

我可以在post类中提供一个函数,它可以自动完成所有的工作,例如:-

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

那么哪种方法更好呢?假设我的数据库是按函数分片的(意味着post\u有\u标记,tag\u有\u posts表可以在不同的机器上),那么通过第一种方法库用户可以在应用程序级创建分布式事务,如果第二台机器出现故障,我们可以通过removetags()函数回滚第一个操作,在第二种情况下,这应该在库级完成,
我想知道哪一个更好?同样适用于用户追随者,在那里你可以看到追随者和追随者,这些东西也可以在不同的机器上,抱歉英语不好,谢谢:)

0wi1tuuw

0wi1tuuw1#

这通常是用一张table来完成的,一张table上会有。。。

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

主键为postid和tagid(因为同一个标签只能为一篇文章添加一次标签)。
所以你只需要添加一条双向的记录,你就可以看到一篇文章有哪些标签,或者哪些文章有特定的标签。

相关问题