在数据库模式中实现标记

时间:2012-10-06 18:12:30

标签: php mysql tags

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

table comments
-id
-name

table tags
id
name

table comment_tag
comment_id
tag_id

因此,当保存注释(可能是创建或更新)时,我们会得到一堆需要在post_tag表中创建,插入或删除的标记。事实上,有三种可能的情况:

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

这样做的最佳/最佳方式是什么?

选项1:根据comment_tag状态,遍历每个POSTed标记并采用上述3条路线之一。

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

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

1 个答案:

答案 0 :(得分:3)

这应该以最佳状态执行,并显示如何插入其他字段 更新:

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