【问题标题】:How do you merge tags on an already existing system如何在现有系统上合并标签
【发布时间】:2010-10-18 15:47:52
【问题描述】:

我们有一个简单的界面来标记一个特定的问题

(e.g. entry has 1..many tags and each tag entry has a foriegn key pointer back to the entry table)

1.    What is the current production version of the jdk? (Tags: jdk6 jdk-6 jdk java)
2.    In what version was java.util.spi package introduced? (Tags: jdk-6, jdk7, jdk5)
3.    Which version of java is going to be released soon? (Tags: jdk-6, jdk7, jdk8)

我们希望将所有名为“jdk-6”的标签合并到 jdk6。我们如何在一个接近生产但包含有用数据的系统中实现这一点。

在 [1] 中需要删除 jdk-6,因为 jdk6 已经存在。在[2,3]中jdk-6需要重命名为“jdk6”。

我需要什么样的脚本才能有效地迁移这些数据。

编辑

create table entry (id, question, ...)
create table entry_tag (id, entry_id, tag)

【问题讨论】:

  • 你能解释一下你的表结构吗?

标签: sql mysql database database-design


【解决方案1】:

我会做以下事情:

  1. 用好标签更新“坏”标签 (UPDATE TagTable SET Tag = 'jdk6' WHERE tag = 'jdk-6')

  2. 删除重复的标签(entry_id 和 Tag 相同)。具体如何执行此操作将取决于您在表上是否有单独的唯一键,但快速 google 将为您提供在不同情况下工作的各种方法。

  3. 假设您有一个包含所有可用标签列表的 TagsList 表,请从中删除 jdk-6 (DELETE FROM TagsList WHERE Tag = 'jdk-6')。

【讨论】:

  • +1 但标记的重点通常是不提前指定整个域。这导致:如果它只能再次“分类”,为什么要修复它?
【解决方案2】:

我将首先创建一个包含条目 ID 列表的新表,其中包含标签“jdk-6”或“jdk6”。

然后我将删除标签“jdk6”和“jdk-6”的所有标签记录。

然后我会使用开始时创建的表将它们添加回来。

【讨论】:

  • 这真的会影响 entry_tag.entry_id 上索引的聚类因子
【解决方案3】:
/* Step 1 - Delete where both tags exist */
delete from et1
    from entry_tag et1
        inner join entry_tag et2
            on et1.entry_id = et2.entry_id
                and et2.tag = 'jdk6'
    where et1.tag = 'jdk-6'

/* Step 2 - Update remaining tags */
update entry_tag
    set tag = 'jdk6'
    where tag = 'jdk-6'

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 2011-07-26
    • 2013-07-22
    • 1970-01-01
    • 2017-11-15
    • 2013-10-07
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多