Как я могу создать систему тегов, например stackoverflow.com? - PullRequest
4 голосов
/ 11 февраля 2012

Я собираюсь сделать сайт для публикации с тегами. Тегов может быть до пяти, как на stackoverflow.com.

Кто-нибудь может подсказать систему тегов StackOverflow? Система реляционных баз данных с постом и тегом.

Должен ли я добавить столбец в таблицу сообщений или создать для него отдельную таблицу тегов? Теги могут быть разделены пробелами или запятыми.

1 Ответ

9 голосов
/ 11 февраля 2012

Определенно создайте таблицу, содержащую в списке доступных тегов .

Вы также должны обязательно создать отдельную таблицу примененных тегов , содержащую:

  • Внешний ключ к вашему сообщению.
  • Внешний ключ вашего тега.
  • Порядковый номер, показывающий порядок.
  • Все остальное, что может вас заинтересовать, например, кто добавил тег или когда он был добавлен.

Вы хотите использовать нормализованный дизайн, потому что используется денормализованный дизайн (добавление 5 столбцов)сломается, если вы когда-нибудь захотите изменить свои бизнес-правила, чтобы разрешить использовать меньше или больше тегов.Кроме того, это не поможет вам, если у вас есть другая информация, например, когда был добавлен тег и кем.


РЕДАКТИРОВАТЬ: DDL

По запросу ОП:

CREATE TABLE post (
  id            INTEGER       IDENTITY 
, title         VARCHAR(1000) NOT NULL
, added_date    DATETIME      NOT NULL
, posting_user_id INTEGER     NOT NULL
, ... (and so forth) ...
, PRIMARY KEY (id)
, FOREIGN KEY (posting_user_id) REFERENCES posting_user (id)
);

CREATE TABLE tag (
  id            INTEGER       IDENTITY
, term          VARCHAR(20)   NOT NULL
, description   VARCHAR(1000) NULL
, ... (and so forth) ....
, PRIMARY KEY (id)
);

CREATE TABLE applied_tag (
  post_id       INTEGER       NOT NULL
, tag_id        INTEGER       NOT NULL
, display_order INTEGER       NOT NULL
, tagging_user  INTEGER       NOT NULL
, applied_date  DATETIME      NOT NULL
, ... (anything else you want)....
, PRIMARY KEY (post_id, tag_id_, display_order) -- Or use an auto-increment, but this is unique.
, FOREIGN KEY (post_id) REFERENCES post (id)
, FOREIGN KEY (tag_id) REFERENCES tag (id)
, FOREIGN KEY (tagging_user) REFERENCES posting_user (id)
);
...