如何制作像stackoverflow.com这样的标签系统?

时间:2012-02-11 17:54:13

标签: database tags relational-database

我打算在网站上贴标签。标签最多可以包含五个标签,例如stackoverflow.com。

有人能告诉StackOverflow的标签系统吗?带有post和tag的关系数据库系统。

我应该在post表中添加一列还是应该为它创建单独的标记表?标签可以用空格或逗号分隔。

1 个答案:

答案 0 :(得分:9)

绝对创建一个包含可用标记列表的表格。

您还应该创建一个单独的应用标记表,其中包含:

  • 您帖子的外键。
  • 标记的外键。
  • 序号 显示订单。
  • 您可能感兴趣的任何其他内容,例如谁 添加了标签或添加标签。

您希望使用规范化设计,因为如果您想要更改业务规则以允许更少或更多的标记,则使用非规范化设计(添加5列)将会中断。此外,如果您要保留其他信息,例如添加标签时以及由谁添加信息,它对您没有帮助。


编辑:DDL

根据OP的要求:

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)
);