3

ユーザーがアイテムにタグを付けて、タグを使用して検索できるようにしたいと考えています。これをきれいに達成する最良の方法は何ですか?これまでのところ、私が思いついた解決策は、現在のデータベース システムに 2 つのテーブルを追加することだけです。

<db Trackable product 1>
int id;
info etc
</>

<db Trackable product 2>
int id;
info etc
</>

//defines the M:M relationship between Tag and various types of Trackable products
<db TagLink>
int trackableProd1Id
int trackableProd2Id
int tagId
</>

<db Tag>
int tagId
tag name etc
</>

これは良い方法ですか?このアプローチの利点は、拡張性が高く、TagLink テーブルに列を追加するだけで、追跡可能な製品を将来さらに追加できることです。数十のテーブルを追跡することを計画している場合、これは明らかに良い考えではありませんが、最大 3 ~ 4 個のテーブルでは、うまく機能することが証明されるはずです。

4

2 に答える 2

2

通常、タグは多対多の関係 (必要に応じて m:n の関係) で実装されます。次の 3 つのテーブルがあります。

tags
    id INT NOT NULL AUTO INCREMENT
    name VARCHAR NOT NULL
    .
    .
    .
    possibly other fields
    .
    .
    .
    PRIMARY KEY (id)

items_you_want_to_tag
    id INT NOT NULL AUTO INCREMENT PRIMARY KEY
    name VARCHAR NOT NULL
    .
    .
    .
    possibly other fields
    .
    .
    .
    PRIMARY KEY (id)

xref
    tag_id INT NOT NULL
    item_id INT NOT NULL
    FOREIGN KEY (tag_id) REFERENCES tags(id)
    ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (item_id) REFERENCES items_you_want_to_tag(id)
    ON UPDATE CASCADE ON DELETE CASCADE,
    PRIMARY KEY (tag_id, item_id)

もちろん、上記のスキーマは疑似コードです。

したがって、あなたのスキーマは、1 つの例外を除いて、私にはほぼ正しいように見えます。2 つのテーブルにタグを付けたい場合は、商品タイプごとに個別のタグ テーブルを作成し (この場合、追跡可能な製品 1 と追跡可能な製品 2 のテーブル)、2 つの交差テーブルも作成します。したがって、テーブルは 6 つになります。

ただし、必ず正しいインデックスを使用してください。そうしないと、それほどうまくスケーリングされません:)

アップデート:

または、両方の製品タイプに同じタグを付けたい場合は、製品グループを含む交差テーブルに別のフィールドを追加し、それを複数の主キーに追加します (mjv で既に指摘されているように ;))。

于 2010-03-02T03:08:54.423 に答える
1

TagLink テーブルに複数の「TrackableProd_N_id」列ではなく、次のような複数列の外部キーを導入することをお勧めします。

   TagLink table
      int ProdGroup    -- "points" to table 1 vs. table 2 etc.
      int ProductId
      int TagId

このようにして、追加の製品ソースが登場したときに、それらの新しい ProdGroup 番号を「発明」し、ProductId (または上記のテーブルの他の主キー) を使用するだけで済みます。

于 2010-03-02T03:09:46.273 に答える