编程语言
首页 > 编程语言> > php – 如何在三表系统中插入标签

php – 如何在三表系统中插入标签

作者:互联网

虽然像Joomla这样的一些主要系统在主文章数据库中将标签存储为逗号分隔的文本,但是作为文章,标签和标签关系的三个表的标准化系统是首选(如Wordpress使用的其他系统).关于结构和阅读的讨论和问题很多;但我无法找到最好的INSERT命令,因为我们需要插入三个表.如何通过一次SQL运行快速运行此过程?或者我们需要先插入文章,然后每个标签,最后写出关系?

另一个问题是关于标签的唯一性.该系统的主要优点是我们只需要存储每个术语一次(然后连接到相应的文章).使用mysql UNIQUE避免重复是否切实可行?或者(正如我在某处读到的那样)我们需要将整个标签列表作为数组读取,以找到任何重复以捕获标签ID并避免存储该术语?

将整个过程分为三个步骤:

>插入文章
>使用UNIQUE INSERT标记,但不管它们的关系如何
>查找每个标签ID并与文章ID建立关系

我对吗?我问的原因是我看到人们将标签作为数组捕获并进行比较.对我而言,这是非常缓慢的,并且会导致性能下降,尤其是UPDATE.

解决方法:

您一次只能在一个表中插入.

一种解决方案是使用触发器,另一种是使用事务.
第一个可以用于任何引擎,后者需要InnoDB或类似的引擎.

确保在字段tag.name上放置UNIQUE索引.

1 – 使用交易

START TRANSACTION;

INSERT IGNORE INTO tag (name) VALUES ('$example1', '$example2');
INSERT INTO article (title, body) VALUES ('$title','$body');
SET @article_id = LAST_INSERT_ID();
INSERT INTO tag_link (tag_id, article_id) 
  SELECT t.id, @article_id FROM tag t WHERE t.name IN ('$example1','$example2');

COMMIT;

2 – 在黑洞桌上使用触发器

使用以下字段创建一个类型为blackhole的表.

title: varchar(255)
body: text
tag1: varchar(50) DEFAULT NULL
tag2: varchar(50) DEFAULT NULL
...
add as many tags as you want.

将一个AFTER INSERT触发器添加到黑洞表中,为您进行实际存储.

DELIMITER $$

CREATE TRIGGER ai_bh_newacticle_each AFTER INSERT ON bh_newacticle FOR EACH ROW
BEGIN
  INSERT IGNORE INTO tag (name) VALUES (new.tag1, new.tag2,...,new.tag25);
  INSERT INTO article (title, body) VALUES (new.title,new.body);
  SET @article_id = LAST_INSERT_ID();
  INSERT INTO tag_link (tag_id, article_id) 
    SELECT t.id, @article_id FROM tag t 
    WHERE t.name IN (new.tag1, new.tag2,...,new.tag25);
END$$

DELIMITER ;

DELIMITER $$

现在,您只需在单个语句中插入带有标记的文章:

INSERT INTO bh_newarticle (title, body, tag1, tag2, tag3) 
  VALUES ('$title','$body','$tag1','$tag2','$tag3');

回到你的问题

Am I right? The reason that I asked is that I saw people catch the tags as an array and make a comparison. To me it is very slow, and kills the performance, particularly for UPDATE.

标签仅在有限数量的情况下才有用.如果你在tag.name上放一个(唯一的)索引,那么查找标签会非常快,即使有10.000个标签.这是因为您正在寻找完全匹配.如果你真的很匆忙,你总是可以在标记表中创建一个带有哈希索引的内存表.
我怀疑你需要担心标签查找的缓慢.

只要确保每篇文章不允许太多标签. 5似乎是一个良好的开端. 10会太多.

链接
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html

标签:php,sql,mysql,database-performance,insert
来源: https://codeday.me/bug/20190826/1733492.html