0

私は曲データベース システムを使用して、多対多の関係データベースで mysql を使用して php を学習しています。以下は、3 つのテーブルがどのように編成されているかを示しています。

Songs       Link        Tags
=======     =====       =======
Sid          Sid        Tid
Songname     Tid        Tagname

タグのシノニムがあるとどうなるか考えていました。私は、入力されたタグと組み合わされた各曲の一致率を計算しています。1曲に20個のタグを入力したくないので、すべての可能性をカバーしますが、4つのタグが入力されたため、一致率が台無しになり、4/20一致別名20%になりましたが、4/8でなければならなかった可能性があります(50%)。

入力されたタグが最初にこのテーブルでチェックされ、次にこれ/これらの「ヘッドタグ」がリンクテーブルと一致するように、タグが「グループ化」されていることを確認して、同義語のテーブルを作成するスマートな方法はありますか?曲名と入力されたタグの一致率 / 「頭のタグ」の合計数 × 100% になります。

それに加えて、新しい曲が入力されたときに、新しいタグが所属するグループに入力され、既存のタグがスキップされるクエリを作成するにはどうすればよいでしょうか。このヘッドタグを新曲にも繋げながら?

このアイデアが現実的かどうかはわかりませんが、同義語を考慮しながら正確な一致を得るために、他のシステムがどのようにこれを行うのだろうか.

4

2 に答える 2

0

テーブルタグに3番目の行を追加できます。

Tags
--------------
Tid
Tagname
HeadTagId

したがって、すべてのタグはHeadTagを参照し、HeadTagはそれ自体を参照します。

クエリに関しては、2つのシナリオを想像します。また

-タグは事前定義されています。新しい曲が入力されると、曲に1行追加し、タグと同じ数の行をリンクに追加します。テーブルタグに触れる必要はありません。

また

-ユーザーは新しいタグを定義できます。新しい曲を入力するときに、タグがすでに存在するかどうかを確認し、存在しない場合は、ユーザーが新しいタグを入力して、ヘッドタグとして定義するか、既存の'ヘッドタグを選択できるようにする必要があります。 'それらのために(すなわち、タグの3番目の行で参照されるタグ)。

いずれにせよ、特定の曲のヘッドタグを取得するには、次のようなものが必要になります。

SELECT HeadTagId FROM Tags
JOIN Link ON Tags.Tid=Link.Tid
WHERE Link.Sid=12345

また、(Idの代わりに)head_tagの名前を直接必要とする場合:

SELECT Tagname FROM Tags AS TagParents
JOIN Tags AS TagChildren ON TagParents.Tid=TagChildren.HeadTagId
JOIN Link ON Link.Tid=TagChildren.Tid
WHERE Link.Sid=12345

編集:この場合、多対多の関係は必要ありません。各タグは、メインタグまたは同義語であることを宣言し、メインタグを指す必要があるためです。それは3行目で達成されます。これは各タグの必要な属性であり、各タグにはそのような属性が1つしかないため、同じテーブルに含めるのは理にかなっています。

したがって、メインタグはそれ自体を参照します。つまり、次のようになります。

Tid: 1
Tagname: 'Classical'
HeadTagId: 1

同義語はメインタグを指します。

Tid: 2
Tagname: 'Classical music'
HeadTagId: 1

このアプローチの唯一の問題は、メインタグの簡単なリストがないことですが、簡単な方法で生成できます。

SELECT DISTINCT HeadTagId FROM Tags
于 2012-06-13T22:38:57.783 に答える
0

確かに - あなたの答えの一部は、もう少し進んでください:

tag_synonym
-----------
Tid
Tid2

次に、シノニムのいずれかが元のタグと同様にリンクされているかどうかを確認するためにクエリを実行できます

于 2012-06-13T20:13:08.243 に答える