ユーザーが好むトピックのテーブルを設定するにはどうすればよいですか? 私はトピックテーブルとユーザーテーブルを持っています (実際にはもっと単純化されていますが、ここでの投稿のために簡略化されています)。ユーザーが作成したトピックの数は増え続けています。ユーザーがページを気に入ってくれるようにするにはどうすればよいですか? トピックの ID をユーザー テーブルに入れるか、ユーザーの ID をトピック テーブルに入れるか、または新しいいいね! テーブルを作成しますか? 問題は、トピックの数が (潜在的に) 非常に多くなる可能性があることです。ユーザー ID とトピック ID の関係を可能にするシステムを作成するには、何を使用できますか?
4 に答える
あなたができることは、「多対多」のテーブル構造です
- 一意の自動インクリメント ID -
UINT (10) AUTO_INCREMENT
- ユーザーIDを含むフィールド -
UINT (10)
(またはメインフィールドに一致するものuser_id
) - 「いいね」されたトピック ID を含むフィールド
UINT (10)
(またはメイン フィールドに一致するものtopic_id
)
user_id
とフィールドの両方topic_id
が一緒に一意である必要があります。つまり、ユーザーごとに特定の「いいね!」に対して 1 行しか存在できないということです。これにより、(データベース側で) ユーザーがトピックを 2 回以上いいね! することが許可されなくなります。
ユーザーが好きなトピックを取得すると、次のようになります-
SELECT * FROM user_likes` WHERE `user_id`=USER_ID
いいねごとにユーザーを取得すると、次のようになります-
SELECT * FROM user_likes WHERE
topic_id`=TOPIC_ID
他の人が回答で言っているように、また@trevorが以下のコメントで言っているように-
ユーザーが気に入ったトピックの取得をサポートするために、ユーザー ID にインデックスを追加することを忘れないでください。トピックの別のインデックスは、ユーザー クエリごとのトピックをサポートするためのものです。これらがないと、時間の経過とともにデータが追加されるにつれてクエリが遅くなります。
別のいいねテーブルを作成します。これは別のエンティティであるため、いいねテーブルをusers&topicsテーブルに
リンクし、likesテーブルの外部キーとしてuserid&topicsidを使用します。
このような構造を持つとよいでしょう。後で、好きな機能が必要ない場合は、他のテーブルに影響を与えずに削除することができます...
「いいね」テーブルが必要になります。何かのようなもの:
CREATE TABLE `users_likes` (
`user_id` INT(10) UNSIGNED NOT NULL,
`topic_id` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`user_id`, `topic_id`),
INDEX `topic_id` (`topic_id`)
)
これを行う 1 つの方法は、新しいテーブルUserLikedTopics
などを作成することです。このテーブルには、2 つの列があり、1 つは を保持しUserId
、もう 1 つは を保持しTopicId
ます。ユーザーが「いいね」した新しいトピックごとに、UserId と TopicId を含む新しい行をテーブルに追加します。こうすることで、どのユーザーがどのトピックを気に入っているかを簡単に追跡できます。
特定のユーザーが好きなトピックを取得するには、UserLikedTopics をトピック テーブルに結合するだけで、特定のユーザーが好きなすべてのトピックのリストが得られます。逆に User テーブルに結合して、特定のトピックが好きなユーザーのリストを取得することもできます。