Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22

    aggiornare Db mysql con dati da altri Db mysql

    Salve, ho la necessita di aggiornare di "continuo" un db (chiamiamolo master) con dati provenienti da altri db (chiamiamoli slave).
    Ovviamente, in termini di struttura, i db sono tutti uguali.
    Ogni db (sia il master che gli slave) sono popolati da dati dei rispettivi processi/programmi che si appoggiano a relativo db.
    Abbiamo (semplificando) che:
    db A(diciamo il master) con una tabella X e un db B (diciamo il primo slave) con relativa tabella X.

    il numero di tuple su tabella x di A segue una sua numerazione e diciamo che ci sono 100 record id=1,2,..100;
    il numero di tuple su tabella x di B segue la sua numerazione e diciamo che ci sono 10 record id=1,2,...10;

    devo copiare i record della tabella x di B sulla tabella x di A.

    ogni tabella ha una chiave primaria numeriva autoincrementante.

    Una prima idea potrebbe essere quella di esportare tutto della tabella x del db B tranne le chiavi primarie e poi importare i record sulla tabella master; durante la copia, mysql "riassegna" le chiavi primarie in automatico e fin qui, diciamo, che protrebbe essere fattibile.
    Primo problema, mentre il "primo aggiornamento" tra le due tabelle dovrebbe andare a buon fine, durante il "secondo aggiornamento" (la popolazine della tabella x di B è arrivata a, diciamo, 20 record) ci sarebbe di nuovo la copia dei primi 10 record (record gia copiati con la prima iterazione del processo) oltre ai nuovi (con id= da 11 a 20), che ovviamente porta ad una moltiplicazione dei record non rispondente alla "somma" del numero di record delle due tabelle.

    Allora si potrebbe pensare a marcare i record, gia copiati, dello slave (i due db non sarebbero piu uguali) ed esportare con condizione "se il mark=copiato" allora non esportare eccc ecc.

    Forse tutto questo è possibile tramite codice php ecc ma mi sembra estremamente "macchinoso", c'è qualche altro metodo intrinseco a mysql che implementa tutto questo ?

    saluti

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Ci sono vari modi per fare quello che chiedi.

    Ti dico come farei Io
    __________________________________________________ _____

    Aggiungi um campo chiamiamolo "IDT" ( Marcatore di tabella )
    con le seguenti caratteristiche:
    ___ Testo
    ___ Not Null
    ___ Indicizzato
    ___ Valore predefinito - A - B - C - ecc in funzione del nome della tabella
    ( quindi questa è 1 differenza fra le varie tabelle )

    __________________________________________________ ____

    Ridefinisci la Key di tabella come IDR & IDT

    ( Posto che IDR sia il nome del tuo attuale ID autoincrementale )

    __________________________________________________ ______


    Hai ottenuto che in tutte le tue tabelle - B - C - D - ecc
    non hai mai un record identico all'altro in quanto la kei
    tiene conto appunto di IDR & IDT

    ______________________________________


    Detta diversamente in nella tabella B avrai:

    B10 B11 B18 B24

    Nella tabella C avrai
    C9 C11 C18 C23

    e nella tabella A avrai
    A4 A12 A15 B10 B11 B18 B24 C9 C11 C18 C23

    ______________________________________________


    durante la copia, mysql "riassegna" le chiavi primarie in automatico e fin qui, diciamo, che protrebbe essere fattibile.
    No questo lo devi impedire
    La key deve restare quella della tabella di origine

    __________________________________________________ _______

    "secondo aggiornamento" (la popolazine della tabella x di B è arrivata a, diciamo, 20 record) ci sarebbe di nuovo la copia dei primi 10 record (record gia copiati con la prima iterazione del processo) oltre ai nuovi (con id= da 11 a 20), che ovviamente porta ad una moltiplicazione dei record non rispondente alla "somma" del numero di record delle due tabelle.
    Questo lo risolvi senza marcare nulla in quanti i singoli record
    sono gia "marcati" dalla loro Key come definita sopra e che non è
    cambiata nel processo di copia

    Devi fare semplicenente una:

    INSERT INTO A
    SELECT B
    WHERE (IDR & IDT) di B " Non sia già " in A

    __________________________________________________ ________



  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    Grazie 1000 per la risposta, ottima "dritta".
    Mi sorgono pero dubbi sulle chiavi:
    su ogni tabella attuale (sia "master" che "slave") vengono fatte query, sulla base del'ID, cosi come progettate, se modifico la chiave delle relativa tabella, facendola diventare una chiave "composta", le query attuali continuano a funzionare ?
    grazie in anticipo.
    saluti

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da domge
    su ogni tabella attuale (sia "master" che "slave") vengono fatte query, sulla base del'ID, cosi come progettate, se modifico la chiave delle relativa tabella, facendola diventare una chiave "composta", le query attuali continuano a funzionare ?
    ________________________________________________

    Io non ho MySql e lo ho usato molto poco.

    Se sono solo query direi che ti funziona tutto
    Se invece hai delle relazioni con integrita referenziale
    direi che non funziona

    ________________________________________________


    Comunque alla luce della tua domanda scarterei quanto ti ho
    consigliato 2 post fà.

    _____________________________________________


    Resta fermo il fatto che tu hai bisogno di un id univoco
    NON nella singola tabella ma nell'insieme delle tabelle di tutti
    i tuoi DB Slave.


    ___________________________________________

    Posso darti altre 2 idee

    ____________ 1° Piu semplice

    Quanti sono i DB Slave ( immaginiamo 20 )
    Quanti record immagini che possa contenere ogni DB ( immaginiamo 1.000.000 )

    Nel DB A incrementi il IDR da 1 a 1.000.000
    Nel DB B Incrementi il IDR da 1.000.001 a 2.000.000
    Nel DB C Incrementi il IDR da 2.000.001 a 3.000.000
    Nel DB D Incrementi il IDR da 3.000.001 a 4.000.000


    Verifica il numero massimo che puoi scrivere in un campo numerico
    di MySql e se ci stai dentro ( direi di si ) puoi risolvere semplicemente cosi



    Ti fai uno script che ti ( Nel caso del DB D )
    __ Toglie la relazione ( se c'è )
    __ UPLOAD del campo Key al valore di se stesso + 3.000.000
    __ UPLOAD dei campi Chiave esterna al valore di se stesso + 3.000.000
    __ Ricrea la relazione ( se la avevi tolta )
    __ Aggiunge un vincolo di validazione affinche il valore del campo Key
    sia compreso SENZA EQUIVOCI fra 3.000.001 e 4.000.000





    Hai fatto delle piccole e semplici modifiche ai DB
    non hai chiavi composite
    e hai una Key univoca NON solo nella tabella ma nell'insieme dei tuoi DB



    ____________ 2° Parecchio piu complesso


    Modifichi il campo Key in modo che non sia piu numerico
    bensi testuale

    La tua attuale Key Incrementale la trasformi in una
    stringa composta per esempio da AA1 AA2 ecc
    ( In pratica metti 2 caratteri davanti al numero incrementale )
    La regola di incremanto la devi impostare te nel DB

    ( Questo chiaramente nel DB A ( Nel DB B sara BB1 BB2 ecc ))


    Ti devi occupare anche delle tabelle Figlie


    Sei arrivato ancora al risultato di avere la Key univoca
    nell'insieme dei tuoi DB


    __________________________________________________ ________



  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    Ok, grazie per queste "dritte", il discorso è ormai chiaro.
    Per le future applicazioni implementerò la funzione della chiave composta, a mio avviso, soluzione molto utile e geniale.
    Per le applicazioni gia in essere faro prove varie.
    Un'ultima domanda: qual'è la scelta migliore tra una chiave composta ed una alfanumerica (ovvero unico campo), in termini di velocita della query ?
    Ovviamente, intendo, quando il db si fa "molto" popolato, ovvero con un numero elevato di record.
    Nel ringraziare ancora una volta, saluto tutti e in particolar modo nman.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.