Stack Overflow标签系统,如何

时间:2010-08-22 15:53:28

标签: php mysql tags foreign-keys

好的,现在我可以理解SO的搜索系统主要是基于标签,他们使用的标签系统非常好,但我想做的是为我自己的项目复制它。

现在我可以理解如何使用外键等,但我不确定它是如何在这里开发的,它们是使用3个表还是2个等。

他们是如何开发它的,你能告诉我一些MySql的例子吗?

1 个答案:

答案 0 :(得分:2)

SO认为问题和答案是相同的 - Post。这是一个精简的MySQL等效表:

DROP TABLE IF EXISTS `example`.`post`;
CREATE TABLE  `example`.`post` (
  `postid` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`postid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

标签存储在典型的类型代码表中:

DROP TABLE IF EXISTS `example`.`tags`;
CREATE TABLE  `example`.`tags` (
  `tagid` int(10) unsigned NOT NULL auto_increment,
  `tagname` VARCHAR(45) NOT NULL,
  PRIMARY KEY  (`tagid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

将标记与问题/帖子关联在数据库中的多对多表中记录 - 在SO中,它被称为POSTTAGS

DROP TABLE IF EXISTS `example`.`posttags`;
CREATE TABLE  `example`.`posttags` (
  `postid` int(10) unsigned NOT NULL auto_increment,
  `tagid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`postid`,`tagid`),
  KEY `fk_tag` (`tagid`),
  CONSTRAINT `fk_post` FOREIGN KEY (`postid`) REFERENCES `post` (`postid`),
  CONSTRAINT `fk_tag` FOREIGN KEY (`tagid`) REFERENCES `tags` (`tagid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

POSTTAGS表:

  • 只有两列,这些列是主键 - 这确保不会有重复,并且任何一方(post或tag)永远不能为NULL。
  • 外键要求表中存储的数据必须已存在于相应的外表...

如果您想要查看SO模式,check out the Stack Data Explorer - 撰写查询时,SO模式可在右侧获得。