Il modo migliore per mantenere i dati tra database sql locali e remoti [duplicato]

22

Quindi ho, quella che sembrerebbe una domanda comune a cui non riesco a trovare risposta. Sto cercando di trovare qual è la "best practice" su come architettare un database che mantiene i dati localmente, quindi sincronizzare tali dati su un database remoto condiviso tra molti client . Per rendere le cose più chiare, questo database remoto avrebbe molti client che lo utilizzano.

Ad esempio, se avessi un'applicazione desktop che memorizza gli elenchi delle cose da fare (in SQL) con singoli elementi. Quindi voglio essere in grado di inviare quei dati a un servizio web che ha una copia "master" di tutte le informazioni sui diversi client. Non sono preoccupato di sincronizzare i problemi tanto quanto sto cercando di pensare attraverso l'architettura effettiva delle tabelle del client e delle tabelle dei servizi web

Ecco un esempio di come ci stavo pensando:

Database client

list
--list_client_id (primary key, auto-increment)
--list_name

list_item
--list_item_client_id (primary key, auto-increment)
--list_id
--list_item_text

Database principale basato sul Web (condiviso tra molti client)

list
--list_master_id
--list_client_id (primary key, auto-increment)
--list_name
--user_id


list_item
--list_item_master_id (primary key, auto-increment)
--list_item_remote_id
--list_id
--list_item_text
--user_id

L'idea sarebbe che il cliente possa creare elenchi di cose con gli oggetti e sincronizzarli con il servizio web in qualsiasi momento (cioè se perdono la connettività dei dati e non sono in grado di inviare le informazioni fino a più tardi, nulla uscire fuori ordine). Il servizio web registrerebbe i record con gli ID dei clienti come solo campi aggiuntivi. In questo modo, il client può dire "aggiorna la lista numero 4 con un nuovo nome" e il server prende questo per significare "aggiorna la lista numero 12 dell'utente 12 con un nuovo nome".

    
posta JoeCortopassi 31.01.2012 - 03:35
fonte

2 risposte

2

Abbiamo avuto un caso simile. La soluzione era piuttosto insolita, ogni database, wheter server principale o client locale, aveva una copia della stessa struttura o schema del database. (Stesse tabelle con gli stessi campi e gli stessi tipi di campo).

Aggiungiamo un catalogo di tabelle client:

create table client
{
   client_key int primary key,
   client_title varchar(200)
}

La chiave primaria di ogni tabella era integer, ma, gestita, come stringa / char di un tipo fisso, con numeri interi fino a 9999 9999 9999 9999

La sua lunghezza era abbastanza grande da supportare un grande qty. di record.

I numeri in cui sono memorizzati al contrario, per supportare il riempimento con zeri. Se vogliamo memorizzare un "4", dovrebbe essere come questo: "4000 0000 0000 0000".

Le prime 3 cifre memorizzano la chiave della tabella, imbottita con 0. Il resto delle 12 cifre memorizzava il valore incrementale della chiave riempita di zeri.

Quindi, i seguenti dati:

Client Sequential Number <other fields>
1      1                 ...
2      1                 ...
3      1                 ...
1      2                 ...
2      2                 ...
3      2                 ...
1      3                 ...
2      3                 ...
3      3                 ...

È stato memorizzato nella chiave primaria, di ogni tabella, come segue:

Table_Key        <other fields>
1000000000001000 ...
1000000000002000 ...
1000000000003000 ...
2000000000001000 ...
2000000000002000 ...
2000000000003000 ...
3000000000001000 ...
3000000000002000 ...
3000000000003000 ...

Per evitare collisioni con le chiavi primarie.

    
risposta data 09.02.2012 - 01:49
fonte
0

Capisco che desideri un negozio locale, ad es. copia locale dell'elenco delle cose da fare, quindi caricare i dati e sincronizzarli con il database master. Scrivere i servizi non è la parte difficile, ma gestire la sincronizzazione tra i database. Di recente ho cercato nServiceBus link per migliorare la gestione della sincronizzazione dei dati tra i sistemi. È un'area in cui sono interessante ma non ho ancora trovato il miglior aproach o magic bullet. Consiglierei di dare un'occhiata a nServiceBus.

    
risposta data 31.01.2012 - 03:50
fonte

Leggi altre domande sui tag