2010-10-18 7 views
5

Abbiamo una semplice interfaccia per contrassegnare una particolare domandaCome si fa a unire i tag su un sistema già esistente

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

Vorremmo unire tutti i tag denominati come "JDK6" per JDK6. Come raggiungerlo in un sistema che si avvicina alla produzione ma contiene dati utili.

In [1] jdk-6 deve essere rimosso, poiché jdk6 è già presente. In [2,3] jdk-6 deve essere rinominato come "jdk6".

Che tipo di script è necessario per eseguire la migrazione di questi dati in modo efficace.

EDIT

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

puoi spiegare la tua struttura della tabella? – JNK

+0

aggiunto schema in EDIT – Sam

risposta

0

Desidero in primo luogo creare una nuova tabella con un elenco di ID di ingresso che contengono dei tag 'JDK6' o 'JDK6'.

Quindi rimuoverei tutti i record di tag per i tag "jdk6" e "jdk-6".

E poi li aggiungerei di nuovo usando la tabella creata all'inizio.

+0

Questo sarà veramente fasullo con il fattore di cluster dell'indice su entry_tag.entry_id –

2

vorrei fare quanto segue:

  1. Aggiornare i tag "cattivi" con quello buono (UPDATE TagTable SET Tag = 'jdk6' WHERE tag = 'jdk-6')

  2. Rimuovere i tag duplicati (dove entry_id e Tag sono gli stessi). Il modo esatto in cui lo fai dipenderà dalla presenza o meno di una chiave univoca separata sul tavolo, ma un rapido google ti fornirà una varietà di metodi che funzionano in circostanze diverse.

  3. Supponendo di avere una tabella Elenco etichette con l'elenco di tutti i tag disponibili, rimuovere jdk-6 da esso (DELETE FROM TagsList WHERE Tag = 'jdk-6').

+0

+1 ma l'intero punto di tagging è solitamente quello di non specificare l'intero dominio in anticipo. Il che porta a: perché ripararlo se può uscire di nuovo "di nuovo"? –

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' 
Problemi correlati