我正在为我的应用程序中的帖子创建一个库(就像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()函数回滚第一个操作,在第二种情况下,应该在库级别上完成
我想知道哪个更好?,同样适用于用户关注者,您可以在其中看到关注者和关注者,这些东西也可以在不同的机器上,对不起英语,谢谢:)
答案 0 :(得分:0)
这通常是用一个表完成的,该表的内容类似于...
table: postAssciatedTags
columns: postID,
tagID,
taggedDate (optional)
具有postID和tagID的主键(因为您只能使用相同的标签对帖子进行一次标记)。
因此,您只添加了一条双向记录,就可以看到某个帖子具有哪些标签,或者哪些帖子被某个标签标记了。