1

我正在制作一个用户可以关注标签的微博网站。就像在 twitter 中一样,用户可以关注其他用户。在我的项目中,他们也可以关注标签。实现标签跟踪的数据库设计应该是什么?用户跟踪很容易。

一种方法是在包含帖子的表中有 5 个标签 ID 列:

表:帖子
列:PostID、AuthorID、TimeStamp、Content、Tag1、Tag2...Tag5

我将制作两个逗号分隔的列表:一个是给定用户关注的用户,另一个是给定用户关注的标签:$UserFollowingList 和 $TagFollowingList

并且选择查询可以是:

select ... from `Posts` where ($Condition1) or ($Condition2) order by `PostID` desc ...

$Condition1 = "$UserFollowingList 中的`AuthorID`"
$Condition2 = " ($TagFollowingList 中的`Tag1`) 或($TagFollowingList 中的`Tag2`) ...或($TagFollowingList 中的`Tag5`)"

请建议一个更好的方法?如果我不想限制为 5 个标签怎么办?我有一个想法,但想知道像你这样有经验的开发人员会做什么?

4

1 回答 1

2

您可以使用一张桌子来关注谁喜欢谁

CREATE TABLE `followers` (
`targetID` INT(10) UNSIGNED NOT NULL,
`targetType` ENUM('user','tag') NOT NULL,
`userID` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`targetID`, `targetType`),
INDEX `userID` (`userID`)
)

另一个用于每个帖子中的标签,例如

CREATE TABLE `postTags` (
`postID` INT(10) UNSIGNED NOT NULL,
`tag` INT(10) NOT NULL,
PRIMARY KEY (`postID`, `tag`)
)

编辑:抱歉,第一次没有考虑到它。为了避免使用字符串,因为targetID也必须有一个tags

CREATE TABLE `tags` (
`tagID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`tag` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`tagID`)
)

这将为您提供 $currentUser 正在关注的帖子

SELECT
    p.*
FROM posts p
JOIN posttags pt on pt.postID = p.postID
JOIN followers f ON f.targetType = 'tag' AND f.targetID = pt.tagID
WHERE 
    f.followerID = $currentUserID

UNION 

SELECT
    p.*
FROM posts p
JOIN followers f ON f.targetID = p.authorID AND f.targetType = 'user'
WHERE 
    f.followerID = $currentUserID
于 2012-07-23T18:04:20.253 回答