Stackoverflows Tags система, как

Итак, теперь я могу понять, что поисковая система SO в основном основана на тегах, система тегов, которую они используют, очень хороша в этом, но то, что я хочу сделать, это повторить ее для моих собственных проектов.

Теперь я могу понять, как использовать внешние ключи и тому подобное, но я не совсем уверен, как он был разработан здесь, используют ли они 3 таблицы или 2 и т. Д.

Как они развили его, можете ли вы показать мне несколько примеров MySql?

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 :

  • это только два столбца, и эти столбцы являются первичным ключом – это гарантирует, что не может быть дубликатов, и что обе стороны (почта или тег) никогда не могут быть NULL.
  • Внешний ключ требует, чтобы данные, хранящиеся в таблице, уже существовали в соответствующей внешней таблице …

Если вы когда-нибудь захотите взглянуть на схему SO, проверьте проводник данных стека – при составлении запроса схема SO доступна с правой стороны.