Итак, теперь я могу понять, что поисковая система 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
:
Если вы когда-нибудь захотите взглянуть на схему SO, проверьте проводник данных стека – при составлении запроса схема SO доступна с правой стороны.