Ведение централизованной таблицы тегов - хорошая идея, если вам когда-нибудь понадобится выполнить одно из следующих действий:
- Создайте полный список всех тегов (то есть, теги блога, теги комментариев и теги статьи)
- Обновите теги так, чтобы они обновлялись повсеместно: чтобы при изменении
sqlserver
на sql-server
оно менялось где угодно: в блогах, статьях и комментариях.
Опция 1
очень полезна для создания облаков тегов, поэтому я рекомендую создать таблицу тегов и ссылаться на нее из ваших таблиц.
Если вам никогда не потребуется обновлять теги, как описано в варианте 2, вам никогда не понадобится суррогатный ключ для них.
Скорее всего, вам все равно понадобится ограничение UNIQUE
, и нет смысла не делать его PRIMARY KEY
, если вы не собираетесь их обновлять.
Это также сэкономит вам много объединений: вам не нужно объединяться с таблицей тегов, чтобы показать теги.
GUIDs
более прост в управлении, но они делают индексы и таблицы ссылок достаточно большими по размеру.
Вы можете присваивать числовой идентификатор каждой таблице и ссылаться следующим образом:
tTag (tag VARCHAR(30) NOT NULL PRIMARY KEY)
tTaggable (type INT NOT NULL, id INT NOT NULL, PRIMARY KEY (type, id))
tTagLink (
tag VARCHAR(30) NOT NULL FOREIGN KEY REFERENCES tTag,
type INT NOT NULL, id INT NOT NULL,
PRIMARY KEY (tag, type, id),
FOREIGN KEY (type, id) REFERENCES tTaggable
)
tBlog (
id INT NOT NULL PRIMARY KEY,
type INT NOT NULL, CHECK(type = 1),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)
tArticle (
id INT NOT NULL,
blog INT NOT NULL FOREIGN KEY REFERENCES tBlog,
type INT NOT NULL, CHECK(type = 2),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)
tComment (
id INT NOT NULL PRIMARY KEY,
article INT NOT NULL FOREIGN KEY REFERENCES tArticle,
type INT NOT NULL, CHECK(type = 3),
FOREIGN KEY (type, id) REFERENCES tTaggable,
…)
Обратите внимание, что если вы хотите удалить блог, статью или комментарий, вы должны удалить также из tTaggable
.
Таким образом, tTaggable
используется только для обеспечения ссылочной целостности. Чтобы запросить все теги для статьи, вы просто выполните этот запрос:
SELECT tag
FROM tTagLink
WHERE type = 2
AND id = 1234567
, поэтому все теги можно получить, запросив одну таблицу без каких-либо объединений.