1

ユーザーがタグをフォローできるマイクロブログ Web サイトを作成しています。Twitter のように、ユーザーは他のユーザーをフォローできます。私のプロジェクトでは、タグもフォローできます。タグフォローを実装するには、どのようなデータベース設計が必要ですか? ユーザーのフォローは簡単です。

1 つの方法は、投稿を含むテーブルに 5 つのタグ ID 列を含めることです。

表: 投稿
列: PostID、AuthorID、TimeStamp、Content、Tag1、Tag2...Tag5

カンマで区切られた 2 つのリストを作成します。1 つは特定のユーザーがフォローしているユーザー用で、もう 1 つは特定のユーザーがフォローしているタグ用です: $UserFollowingList と $TagFollowingList

選択クエリは次のようになります。

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

$Condition1 = "`AuthorID` in $UserFollowingList"
$Condition2 = " ( `Tag1` in $TagFollowingList ) または ( `Tag2` in $TagFollowingList ) ... または ( `Tag5` in $TagFollowingList )"

より良い方法を提案してください。タグを 5 つに制限したくない場合はどうすればよいでしょうか。私にはアイデアがありますが、あなたのような開発者が何を経験するのか知りたいですか?

4

1 に答える 1

2

誰が誰をフォローしているか、誰が好きかを示すテーブルを 1 つ使用できます。

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`)
)

そして、各投稿のタグ用にもう1つ

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 に答える