Elaborazione di file csv (alternativa alla business logic nel DB)

1

Stiamo lavorando a un sistema di evasione degli ordini per un negozio di libri online. Ogni giorno riceviamo decine di file CSV (circa 90 file) con dati sugli ordini acquistati.
Esempio:

OrderId    |    BookTitle    |    Quantity    |    Price    |    BuyerName    |    ...
1          |The hunger games |        1       |     10      |    John Doe     |    ...
1          | The Exorcist    |        2       |     25      |    John Doe     |    ...
2          |   Superman      |        1       |     5.5     |    Jane Nose    |    ...

Cosa facciamo attualmente: I dati devono essere tradotti nel nostro dominio in Order entità, OrderItem entità, ... ecc. Carichiamo il file in tabelle fittizie, quindi utilizziamo query molto complesse per popolare la tabella Orders e la tabella OrderItems .

Problema:
 Tutta la logica aziendale è nel database (nelle query) così unità    testarli è un incubo. Inoltre, ci è stato richiesto di cambiare il database che stiamo usando (non esattamente, ma qualcosa di terrificante simile)

Cosa abbiamo provato:
Ci stiamo spostando verso un approccio DDD in cui il modello di dominio è il nucleo dell'applicazione che contiene tutta la logica e la convalida.

Abbiamo provato ad analizzare il file riga per riga e creare le rispettive entità e convalidarle di conseguenza, quindi salvarle nel database.
Ciò ha comportato migliaia di chiamate al database e talvolta il server esaurisce il coz di memoria delle migliaia di record (circa 90 mila record / file) in un singolo file.

So che questo dominio è obsoleto e qualcuno deve aver trovato un modo migliore per gestire tale compito. Come si elaborano file così grandi nel proprio dominio senza subire prestazioni?

UPDATE

  • Usiamo un database MySql con PHP e Apache.
  • Il file CSV viene caricato in una tabella fittizia usando qualcosa di simile a questo:
load data local infile 'orders.csv' into table dummyOrders fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (orderId, bookkTitle,Quantity, Price, BuyerName,...)
    
posta Songo 18.03.2014 - 21:17
fonte

1 risposta

3

Lo stavi facendo bene - carica il file in una tabella fittizia (preferibilmente su un DB di staging), quindi manipola i dati con stored procedure (che sono facili da testare - sono poco più di una singola funzione, e tu può inserire i dati di test nelle tabelle ed eseguire i tuoi sproc usando quei dati in una transazione che può essere ripristinata in modo che possano essere molto isolabili a prescindere da quali dati ci siano).

Una volta che i tuoi dati sono in buono stato, puoi migrarli al DB di produzione. Quello non avrà bisogno di avere tutto il caricamento SQL in esso, quindi può essere più semplice da gestire.

Quindi, in pratica, dividi le tue operazioni in 2, messa in scena e produzione. Ho usato questo approccio con milioni di record e prestazioni molto buone (anche se con SqlServer, non con MySQL).

    
risposta data 18.03.2014 - 23:28
fonte