Pagina 1 din 2 12 UltimulUltimul
Rezultate 1 la 10 din 16

Subiect: Cum sincronizez 3 tabele?

  1. #1
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit Cum sincronizez 3 tabele?

    Am de sincronizat 3 tabele in MySQL, astfel incat daca in oricare din ele se produc modificari (INSERT, UPDATE, DELETE), aceleasi modificari sa fie facute si in celelate 2 tabele, asta pentru fiecare dintre ele.

    Cum/ce atasez de tabele? Triggere? Daca da, imi puteti da un exemplu?

    Ideea e ca trebuie sa am aceleasi date in toate tabelele (ele fiind in baze de date diferite)

    Mersi!

  2. #2
    Avatarul lui dublutz
    dublutz este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    3rd October 2007
    Vârstă
    41
    Posturi
    175
    Putere Rep
    33


    Implicit

    Ai 2 variante

    1. Creezi o procedura care iti sincronizeaza tabelele in care trimiti ca parametru id-ul campului modificat iar daca:
    1.2 Exista in primul tabel si nu exista in cele 2 faci insert
    1.2 Nu exista in primul tabel si exista in cele 2 faci delete
    1.3 Exista in primul tabel si exista in cele 2 faci update

    2. Folosesti triggers
    http://dev.mysql.com/doc/refman/5.0/en/triggers.html

    Da, nu am observat ca sunt in baze de date diferite.
    Atunci se complica putin problema.
    Va trebui sa specifici probabil si numele bazei de date
    SELECT * FROM db1.tabel;
    SELECT * FROM db2.tabel;
    SELECT * FROM db3.tabel;

    Ar trebui sa mearga.
    Ultima modificare făcută de dublutz; 8th October 2008 la 14:04.

  3. #3
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit

    mersi, am "rezolvat" asa:

    Cod:
    delimiter ;
    
    use db1;
    
    delimiter //
    
    CREATE TRIGGER tr_db1 BEFORE INSERT ON db1.sync
    FOR EACH ROW BEGIN
    INSERT INTO db2.sync values (NEW.id,NEW.name);
    INSERT INTO db3.sync values (NEW.id,NEW.name);
    END;
    //
    
    delimiter ;
    
    use db2;
    
    delimiter //
    
    CREATE TRIGGER tr_db2 BEFORE INSERT ON db2.sync
    FOR EACH ROW BEGIN
    INSERT INTO db1.sync values (NEW.id,NEW.name);
    INSERT INTO db3.sync values (NEW.id,NEW.name);
    END;
    //
    
    delimiter ;
    
    use db3;
    
    delimiter //
    
    CREATE TRIGGER tr_db3 BEFORE INSERT ON db3.sync
    FOR EACH ROW BEGIN
    INSERT INTO db1.sync values (NEW.id,NEW.name);
    INSERT INTO db2.sync values (NEW.id,NEW.name);
    END;
    //
    
    delimiter ;
    rezultatul e Query OK.

    Dar, daca fac un INSERT intr-una din bazele de date, primesc eroarea:

    Cod:
    INSERT INTO `db1`.`sync` (`id` ,`name`)
    VALUES ('1', 'a')
    
    MySQL said: Documentation
    #1442 - Can't update table 'sync' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
    Presupun ca eroarea o primesc din cauza recursivitatii, presupun ca e si o varianta mai buna, dar pe care nu o stiu. Aveti vreo idee?

    Mersi!

  4. #4
    Avatarul lui dublutz
    dublutz este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    3rd October 2007
    Vârstă
    41
    Posturi
    175
    Putere Rep
    33



  5. #5
    Avatarul lui forapathy
    forapathy este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    7th May 2007
    Locaţie
    Iasi
    Vârstă
    39
    Posturi
    212
    Putere Rep
    33


    Implicit

    in primul rand nu prea vad logica in a folosi trei tabele cu aceasi informatie..
    inteleg ca tu ai 1 baza de date in care sunt 3 tabele.. care vrei sa contina aceasi informatie.. asta am inteles din ce ai zis tu

    daca te referi la 3 baze de date diferite asta e alta poveste

    dar oricum .. ideea e ca problemele de query-uri ciudate nu se rezolva niciodata frumos direct din sql ci din php (sau ce folosesti tu)..

    logic ar fi cam asa: cand faci INSERT .. sa faci direct in toate cele trei tabele..
    ori cu tranzactii daca ai mysql 5 ori cu functii:

    $tabele = array("tabel1", "tabel2", "tabel3");
    foreach($tabele as $tabel){
    bagaDateInDB($tabel);
    }

    function bagaDateInDB($tabel){
    // te conectezi la baza de date
    $cnx = connectDB();
    // apoi query
    $query = 'INSERT INTO '.$tabel.' VALUES()';
    $result = $cnx->query($query);
    }

    ... cam asa teoretic

    pentru update faci la fel...
    foreach tabel ...
    cauti id-ul intrarii si
    modifici pentru fiecare tabel..

    $id = isset($_GET['id']) ? $_GET['id'] : '';
    $tabele = array("tabel1", "tabel2", "tabel3");
    foreach($tabele as $tabel){
    modificaDateInDB($tabel, $id);
    }

    function modificaDateInDB($tabel, $id){
    // te conectezi la baza de date
    $cnx = connectDB();
    // apoi query

    // aici merge bagat un if sa verifici daca exista id-ul.. daca exista sa faci update
    if(idExista($id)){
    $query = 'UPDATE '.$tabel.' SET campurile si valorile WHERE '.$id.' ';
    $result = $cnx->query($query);
    } else {
    echo 'id nu exista';
    }
    }
    function idExista($id){
    //cauta in fiecare tabel daca exista id-ul si daca da sa
    return true;
    // daca nu sa
    return false;
    }

    pentru delete la fel.. acolo e mai simplu ca doar cauti id-ul si dai delete.

    cred ca e cam babeste si nu prea corect raspunsul dar daca te refereai la teri tabele din aceasi baza de date.. cam asa s-ar face foarte simplu..

    sper sa te ajute raspunsul.. daca nu mai zi odata mai detaliat si poate reusesc sa te ajut
    Scriu, rar, pe point47 diverse tips&tricks in web-dev.

  6. #6
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit

    forapathy, da, de 3 baze de date ziceam, ca sa mai "relaxez" putin toata treaba, facand niste conexiuni pe servere separate. cred ca o pot rezolva cu proceduri stocate, pt ca la fiecare insert, update, delete voi aplela pt fiecare baza de date in parte o procedura stocata care sa faca aceleasi lucruri pe acelasi tabel, dar in baze de date diferite. va spun ce a iesit dupa ce termin de construit logica procedurilor stocate.

    vad ca de pe acelasi server mysql ma pot conecta la baze de date diferite, folosind db_name.table_name. urmatoarea problema ar fi... cum ma pot conecta dintr-o procedura stocata la un alt server mysql

  7. #7
    Avatarul lui forapathy
    forapathy este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    7th May 2007
    Locaţie
    Iasi
    Vârstă
    39
    Posturi
    212
    Putere Rep
    33


    Implicit

    pai teoretic creezi conexiuni diferite pentru serverele care vrei sa le accesezi:

    $cnx = mysqli_connect('example.com', 'mysql_user', 'mysql_password', 'db');
    if (!$cnx) {
    die('Could not connect: ' . mysql_error());
    }

    $cnx2 = mysqli_connect('example2.com', 'mysql_user', 'mysql_password', 'db');
    if (!$cnx2) {
    die('Could not connect: ' . mysql_error());
    }

    dar trebuie sa fie deschise porturile de sql pe acele servere.. multe hostinguri le au inchise
    si foloseste mySqli si cand faci query ii pui direct pe conexiunea de care ai nevoie:

    $result = $cnx->query($query);

    $alt_result = $cnx2->query($alt_query);

    nu am facut niciodata asa ceva dar dupa manual teoretic ar fi functional

    mai ar merge prin tranzactii prin socket-uri dar nu am folosit niciodata si nu te pot ajuta cu asa ceva
    Scriu, rar, pe point47 diverse tips&tricks in web-dev.

  8. #8
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit

    Mersi! Am sa incerc sa vad ce iese cand pun la punct tabelul pt sincronizare

  9. #9
    Avatarul lui Dever
    Dever este deconectat Ambasador
    Reputatie:
    35
    Data înscrierii
    28th July 2006
    Locaţie
    UK
    Vârstă
    43
    Posturi
    378
    Putere Rep
    35


    Implicit

    Am avut o experienta similara in trecut tot cu sincronizarea in 3 locatii. Cu toate ca nu era vorba de PHP/MySQL se poate vorbi in principiu de similaritati.

    Acum banuiesc ca tu nu vrei sa faci sincronizare numai pentru a avea 2 copii ci vrei ca toate locatiile sa poata face diverse modificari (insert, update, delete).

    Prima problema de luat in considerare este disponibilitatea unui server (pt ca am vazut ca ai triggere setate BEFORE INSERT). In cazul asta daca un server nu este "disponibil" nu faci nici un insert (which is bad ). Eu am optat pt o sincronizare cu delay la solutia mea.

    O a doua problema (in cazul unei sincronizari cu delay) sunt coliziunile de ID-uri. Presupunand ca toate serverele sunt la ID-ul 20 si ca pe toate se face insert aproape in acelasi timp vei pierde date (ori prin overwrite ori prin insert care "fail").

    Recomandarea mea ar fi sa iti setezi din start niste reguli (iar vorbesc in necunostinta de cauza si iar s-ar putea sa apara un destept care va zice ca el nu recomanda solutia mea - stii despre ce vorbesc ca tot tu deschisesei si topicul ala). De exemplu: eu aveam unul din cele 3 ca "master" si celelalte erau "slaves". Masterul era singurul care putea sa dea un numar de ordine unic, diferit de ID (ca tot era vorba in topicul precedent). Sclavii trebuiau intotdeauna sa ceara urmatorul numar de ordine de la master pe baza caruia se puteau face sincronizari fara a avea coliziuni de ID-uri.

    Sper sa fi inteles ceva din ce am scris ca e cam tarziu si nu stiu cat de coerent am fost.

    P.S. Inca un lucru ... intotdeauna sa ai verificari de erori de genul "daca operatiunea a fost executata cu succes".
    Dever's Blog - Atentie! dau cu parerea.

  10. #10
    Avatarul lui forapathy
    forapathy este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    7th May 2007
    Locaţie
    Iasi
    Vârstă
    39
    Posturi
    212
    Putere Rep
    33


    Implicit

    Dever are dreptate cu id-urile ca e posibil sa nu fie acelasi in toate cele trei tabele.. ceea ce o sa iti dea foarte multe erori..

    varianta buna e aia cu un tabel master si celelalte care se updateaza dupa cel principal.. dar ar trebui sa faci o verificare si dupa alte campuri nu numai dupa ID..

    ori.. poti folosi o singura baza de date.. de pe un server care sa o accesezi si de pe celelalte domenii.. ca daca tu ai aceleasi informatii in toate trei bazele de date..

    sau faci niste functii care sa faca update la celelalte db si daca ai acces ssh la un server fa un cron si la anumite intervale sa execute acel script php(sau ce of)

    cam multa teorie si cam multa bataie de cap.. si cred ca te complici deja


    p.s. @dever: ehh sunt multi care se baga in seama aiurea si zic ca nu e bun.. dar nici nu te ajuta sa iti rezolvi problema.. da cred ca te-ai obisnuit deja sa ii ignori
    Scriu, rar, pe point47 diverse tips&tricks in web-dev.

Pagina 1 din 2 12 UltimulUltimul

Informații subiect

Utilizatori care navighează în acest subiect

Momentan este/sunt 1 utilizator(i) care navighează în acest subiect. (0 membrii și 1 vizitatori)

Thread-uri Similare

  1. Div-uri sau tabele vs. Google
    De Hobart în forumul Discutii generale privind optimizarea si motoarele de cautare
    Răspunsuri: 11
    Ultimul Post: 24th September 2009, 21:56
  2. divuri sau tabele?
    De blueeyesromanesti în forumul Discutii generale privind optimizarea si motoarele de cautare
    Răspunsuri: 12
    Ultimul Post: 13th October 2008, 00:42
  3. Ati realizat vreodata un site fara sa folositi tabele?
    De Razvan Pop în forumul Client side
    Răspunsuri: 22
    Ultimul Post: 29th October 2005, 18:04

Permisiuni postare

  • Nu puteţi posta subiecte noi.
  • Nu puteţi răspunde la subiecte
  • Nu puteţi adăuga ataşamente
  • Nu puteţi modifica posturile proprii
  •