我正在现有应用程序中实现标签方案。为了简单起见,我们可以假设使用以下表结构
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/