2010-10-18 4 views
5

Nous avons une interface simple pour marquer une question particulièreComment fusionner-vous des balises sur un système déjà existant

(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) 

Nous voudrions fusionner tous les tags nommés comme « JDK6 » à JDK6. Comment y parvenir dans un système qui approche de la production mais contient des données utiles.

Dans [1] jdk-6 doit être supprimé, car jdk6 est déjà présent. Dans [2,3] jdk-6 doit être renommé "jdk6".

De quel type de scripts ai-je besoin pour migrer ces données de façon efficace?

EDIT

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

Pouvez-vous expliquer la structure de votre table? – JNK

+0

schéma ajouté sous EDIT – Sam

Répondre

0

Je voudrais tout d'abord créer une nouvelle table avec une liste d'ID d'entrée qui contiennent soit des balises de JDK6 'ou « JDK6 ».

Ensuite, je supprimerais tous les enregistrements de balises pour les balises 'jdk6' et 'jdk-6'.

Et puis je les rajouterais en utilisant la table créée au début.

+0

Cela va vraiment visser avec le facteur de clustering de l'index sur entry_tag.entry_id –

2

je ferais ce qui suit:

  1. Mettez à jour les balises "mauvais" avec le bon (UPDATE TagTable SET Tag = 'jdk6' WHERE tag = 'jdk-6')

  2. Supprimez les balises en double (où entry_id et Tag sont les mêmes). La manière exacte de procéder dépendra de l'existence ou non d'une clé unique distincte sur la table, mais un rapide google vous fournira une variété de méthodes qui fonctionnent dans des circonstances différentes.

  3. En supposant que vous avez une table TagsList avec la liste de toutes les balises disponibles, enlevez jdk-6 (DELETE FROM TagsList WHERE Tag = 'jdk-6').

+0

+1 mais le point entier de l'étiquetage est généralement de ne pas spécifier le domaine entier à l'avance. Ce qui conduit à: pourquoi le réparer s'il ne peut que sortir des «tris» à nouveau? –

0
/* 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' 
Questions connexes