1

ユーザーは最大 3 つのタグを持つことができ、投稿にも最大 3 つのタグを付けることができるため、私の方法が私の mysql スキーマに関してこれを行う正しい方法であるかどうかはわかりません。

たとえば、投稿にタグがある場合。音楽、テクノロジー。ユーザーには、音楽、スポーツのタグがあります。タグ Music がユーザー プロファイルと投稿の両方に存在するため、ユーザーはその投稿を表示できます。

私のテーブルは次のとおりです。

プロファイルには列があります:

Profile_id | tag1 | tag2 | tag3

投稿には列があります:

post_id | author | item | tag1 | tag2 | tag3.

テーブル内の各タグは、特定のタグに関連付けられています。例tag1= 音楽、tag2= スポーツなど。

タグは、ユーザーがプロファイルの編集時または投稿の作成時にチェックを入れるかどうかに応じてテーブルに挿入されるため、タグは値を持つことができますNULL

4

2 に答える 2

2

まず、デザインを修正する必要があります。タグ テーブルを作成してから、各ユーザーと投稿のルックアップ テーブルを作成します。これにより、ソリューションがより明確になります。

したがって、新しい構造は次のようになります。

プロフィール:

profile_id | Other_Profile_Info ...

役職:

post_id | author | item 

鬼ごっこ:

tag_id | tag

Post_Tag:

post_id | tag_id

Profile_Tag:

profile_id | tag_id

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

SELECT p.* FROM Post AS p
   INNER JOIN Post_Tag AS PostTag ON p.post_id = PostTag.post_id
   INNER JOIN Profile_Tag AS ProfileTag ON PostTag.tag_id = ProfileTag.tag_id
   INNER JOIN Profile AS Profile ON Profile.profile_id = ProfileTag.profile_id
WHERE Profile.profile_id = 'MyID'

またはサブクエリで:

SELECT p.* FROM Post AS p 
WHERE p.post_id IN
   (SELECT post_id FROM Post_Tag WHERE tag_id IN
        (SELECT tag_id from Profile_Tag WHERE profile_id = 'MyID')
   )
于 2013-02-13T17:21:39.813 に答える
2

理想的には、データベースをさらに正規化する必要があります。という名前の新しいテーブルを作成し、Tags列 tag_id と tag_name を使用すると、複数の列よりも柔軟性が高くなります。たとえば、投稿に 100 個以上のタグを付けたい場合はどうすればよいでしょうか?

投稿とタグ (つまり ) の関係を管理する新しいテーブルとpost_tags、タグとユーザー ( user_tags) の関係を管理する新しいテーブルを作成すると、これをより適切に行うことができます。

たとえば、ユーザーの興味に応じてすべての投稿を見つけることができます。

select p.*
from users u
join user_tags ut on u.user_id = ut.user_id
join post_tags pt on ut.tag_id = pt.tag_id
join posts p on p.id = pt.post_id
where u.user_name = 'theUser'

2 つの多対多テーブルに両方の ID の複合キーが必要であり、重複の可能性がないかクエリをチェックする必要があることに注意してください。

于 2013-02-13T17:26:14.973 に答える