Domanda

Sto sviluppando un'applicazione Erlang, che richiede un sacco di DB scrive. Il mio schema è, oltre alla chiave primaria, un altro attributo con un vincolo di unicità forzata.

Dire che ho un ID, un unique_constraint_field, e alcuni altri campi. Ho bisogno di aggiornare ora una riga nel DB corrispondente al ID univoco, dato che nessun altro riga dovrebbe già avere il valore del valore unique_constraint_field ho intenzione di aggiornare.

A causa dell'elevato numero di aggiornamenti (ogni aggiornamento interesserà solo 1 riga) devo effettuare, (richiedendo bassa latenza troppo) I contare sulla chiave primaria e il vincolo univoco quell'attributo per catturare una duplicazione, anziché un'istruzione di aggiornamento utilizzando una sottoquery. Questo mi permette di eseguire l'aggiornamento in una singola query (che avviene il 95% del tempo), e nel restante 5%, che può intercettare l'eccezione di agire necessarie sulla chiave primaria o violazione attributo univoco.

Attualmente sto usando il driver ODBC mysql. Tuttavia il driver restituisce un messaggio di errore molto generico per qualsiasi errore. Anche se in questo momento il mio prototipo funziona bene quando mi assumo ogni errore di essere una violazione di chiave, questo modello è ovviamente più o meno imperfetto. Non riesco a trovare qualsiasi altro driver / modo decente per connettersi a MySQL da Erlang.

Sto pensando di passare a mnesia (memoria modalità solo per le mie esigenze di velocità), come Erlang e mnesia fondono così senza soluzione di continuità. Tuttavia, vedo che mnesia non ha vincoli di chiave uniche che posso usare per svolgere il mio aggiornamento DB in una singola query.

Ho bisogno di suggerimenti quanto modo migliore per attuare questo requisito dall'interno Erlang. C'è un modo di eseguire un aggiornamento condizionale in mnesia? Oppure, c'è qualche altro ad alta velocità DB alternativa che dovrebbe essere guardando? Qualsiasi aiuto / intuizione è molto apprezzato.

È stato utile?

Soluzione

Non so che cosa è la soluzione migliore, ma quello che mi piacerebbe provare è fare due tavoli uno per i record e uno per l'indice con unique_constraint_field e gestire ogni CUD da operazioni CRUD in un'operazione che controllano e indice di aggiornamento. La ragione è che in mnesia non è possibile impostare il tipo di indice ed è sempre bag duplicato. Credo che, poiché l'indice sarà unica in ogni caso, non dovrebbe introdurre alcuna penalità prestazioni aggiuntive. Se si utilizza mnesia funzione indice si devono ancora scrivere le proprie operazioni CUD e il risultato sembra quasi uguale con due tavoli. Fortunatamente mnesia gestisce transazione nidificata con uno sforzo minimo e sviluppatore di questa cosa è relativamente facile rispetto al RDBMS classica.

Altri suggerimenti

mnesia possono scontro con un elevato volume di scritture a meno che sintonizzare . Ma è possibile utilizzare complesse chiavi primarie che sembrano {ID, UniqueConstraint}, che potrebbe rendere i vostri aggiornamenti molto più semplice. C'è anche una nuova libreria Erlang per dette tabelle osmos per su disco ordered_set creata appositamente per gestire grandi volumi scrive.

Ulf Wiger ha rilasciato una libreria che consente di utilizzare mnesia come un database relazionale. Si chiama 'RDBMS', si tratta di un paio di anni e non è stato aggiornato da molto tempo, ma probabilmente è possibile utilizzare così com'è o per lo meno da soli basare il suo lavoro a che fare con esso. Afferra la fonte se si desidera.

La sua descrizione di esso:

  

I rispolverare la mia risposta standard che   contrib 'RDBMS' ha offerto una soluzione   per questo, fornendo il supporto per   composto attributi e definito dall'utente   indicizzazione, compresa la possibilità di   specificare che un valore di indice deve essere   unico nel suo genere.

     

rdbms / è / stato usato commercialmente,   ma io non lo considero pronto per   l'uso commerciale in generale. Non ho   fatto nulla su di esso per un bel po ',   dal momento che non percepisco qualsiasi utente   pressione, ma chi vuole che a   il cambiamento è naturalmente invitati a contattare   me e discutere il loro caso.

     

http://ulf.wiger.net/rdbms/doc/rdbms.html   (La documentazione lasciano molto a desiderare, mi   sapere -. vedi sopra)

Il dottore mentionning il vincolo 'unico' può essere trovato qui . C'è la possibilità di avere colpi alle prestazioni; mnesia intende essere una memoria valore-chiave. Non riesco a ricordare esattamente, ma è possibile definire gli indici 'unici' potrebbe comportare un attraversamento completo tavolo durante il controllo di loro.

Tutto sommato, come è vecchio probabilmente dovrete problemi durante l'esecuzione di esso. Vedere la trapexit discussione su di esso . Usandolo per studiare come è stato fatto potrebbe essere un'idea migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top