php - 在数据库模式中实现标签

标签 php mysql tags

我正在现有应用程序中实现标签方案。为了简单起见,我们可以假设使用以下表结构

table comments
-id
-name

table tags
id
name

table comment_tag
comment_id
tag_id

因此,当保存评论(可以创建或更新)时,我们会得到一堆需要从 post_tag 表中创建、插入或删除的标签。事实上,有3种可能的情况:

  • comment_tag 已存在;无需采取任何行动
  • comment_tag 尚不存在;插入comment_tag表
  • comment_tag 已删除;从comment_tag表中删除

最好/最优化的方法是什么?

选项 1:循环遍历每个已发布的标签,并根据 comment_tag 状态选择上述 3 条路线之一。

选项2删除comment_tag中comment_id = '123'的所有记录,然后进行插入?

这些似乎都不是真正最佳的。我希望有更好的选择。

最佳答案

这应该具有最佳性能,并显示如何插入附加字段更新:

START TRANSACTION;

INSERT INTO comments (name,created) VALUES ('comment', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

INSERT INTO tags (name,created) VALUES
('tag1', NOW()),
('tag2', NOW()),
('tag3', NOW())
ON DUPLICATE KEY UPDATE updates = updates + 1;

DELETE
comment_tag
FROM
comment_tag
INNER JOIN
comments c ON c.id = comment_tag.comment_id
LEFT JOIN
tags t ON t.id = comment_tag.tag_id
WHERE
c.name = 'comment' AND
t.name NOT IN ('tag1','tag2','tag3');

INSERT INTO comment_tag (comment_id, tag_id ,created) 
SELECT
c.id AS comment_id,
t.id AS tag_id,
NOW() AS created
FROM
comments c,
tags t
WHERE
c.name = 'comment' AND
t.name IN ('tag1','tag2','tag3')
ON DUPLICATE KEY UPDATE comment_tag.updates = comment_tag.updates + 1;

COMMIT;

参见 http://sqlfiddle.com/#!2/81f58/1一个交互式示例。

关于php - 在数据库模式中实现标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762460/

相关文章:

php - 在 ReactJs 中使用 axios 发送 POST 请求时 $_FILES 为空

php - 无法获取从 PHP 中的改造发送的请求正文

python - 查找 pyquery 对象的标签名称

c++ - 从 C++ mysql 连接器选择将 longblob 写入文件

html - [X]HTML 自定义标签 : pros & cons

javascript - 从 UL jquery 中删除一个(没有 id)元素

php - 用户生成的内联 css 是否存在任何安全风险

php - MYSQL While 循环下拉菜单

java - 使用 Java 将 XML 数据加载到 mySql 的最佳方法是什么?

php - 如何在 Dropdownlist 中动态分配数据库值?