Ну, обычно теги реализуются с отношением «многие ко многим» (отношение m: n, если хотите). Есть три таблицы:
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» в вашем случае), а также создал две таблицы пересечений. Таким образом, у вас будет шесть столов.
Убедитесь, что вы используете правильные индексы, иначе это не будет так хорошо масштабироваться:)
UPDATE:
Или, если вы хотите иметь возможность пометить оба типа продуктов одним и тем же тегом, добавьте другое поле в таблицу пересечений, содержащую группу продуктов, и добавьте его в первичный ключ multi (как уже указывалось mjv;)) .