如何在数据库中实现标记跟踪?

时间:2012-07-23 17:57:13

标签: database database-schema

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

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

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

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

,选择查询可以是:

从`Posts`中选择...其中($ Condition1)或($ Condition2)通过`PostID`decc命令...

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

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

1 个答案:

答案 0 :(得分: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