0

アイテム、正確には人に特定のタグを割り当てる小さなシステムを構築しようとしています。だから、私は人のリストとタグのリストを持っています。各人に3つの特定のタグを割り当てる必要があります(この人が持つ可能性のある3つの異なるスキルに対応します)。

一言で言えば、出力は次のようになります。

Person 1 | webdesign, ux, jquery
Person 2 | blogging, photography, wordpress
Person 3 | graphic-design, 3d, inventor
...

今のところ、これらのリストは2つの異なるテーブルに保存されています。

persons
-------
person_id
person_name

tags
-------
tag_id
tag_name

私の主な目標は、繰り返しを避け、既存の人に3つの既存のタグを割り当てることです。

これを実装する方法についていくつかのヒントを教えてください。タグ付けシステムでは3つのテーブルのデザインが一般的であることは知っていますが、それは私の状況に関連していますか?

ご協力いただきありがとうございます。

4

3 に答える 3

3

重複がないことを確認しN、人にタグを追加できるようにする場合は、正規化されたデザインを適切に実装するためtagsに、それぞれにリンクする3番目のテーブルが必要になります。person

persons_2_tags
--------------
person_id
tag_id

一意性を保証するために、複合主キーを使用するか、unique index両方の列を含むテーブルにを追加することができます。

このSQLフィドルの上記の例を参照してください。

データベースレベルで3タグ制限を適用する必要がある場合は、persons_2_tagsテーブルに3番目の列(tag_numberたとえば)を追加し、それenumをの値で1, 2, 3追加できますunique index。挿入ロジックはアプリケーションレベルで処理する必要がありますが、によって強制されますindex

于 2012-10-28T23:45:18.707 に答える
1

要件は「正確に」3つのタグを指定していますか?

3番目の表は、正規化したままにすることをお勧めします。これは典型的な多対多の関係です。これにより、ユーザーとタグのペアの無制限でありながら一意のリストを作成できるため、最大限の柔軟性が得られます。

タグごとにユーザーテーブルに3つの列を含めることができます。柔軟性を犠牲にしてパフォーマンスが向上します。「tag='X'ですべてのユーザーを一覧表示する」のようなクエリは少し難しいです。3つ未満のタグを許可する場合、いくつかのnull値が存在する可能性があります。もちろん、この設定では、新しい列と、3つの列を超えて拡張するための多くのコードを作成する必要があります。

于 2012-10-28T23:51:20.493 に答える
0

ジェフ・オーが言った3つのテーブルのデザインはおそらくやろうと思いますが、別の見方をするためだけに...

タグ、つまり他のメタデータのない短い文字列について話しているだけの場合、テーブルが必要かどうかはわかりません。tags基本的に、タグ自体がそのIDである可能性があります。

persons (person_id, person_name);
tags (person_id, tag);

ええ、あなたはそこで少し繰り返しを得るでしょう、しかしそれらはとにかく短い文字列であり、それは本当に違いを生むはずです。

于 2012-10-29T00:01:34.283 に答える